天天看點

Spring Boot自動配置主應用類配置類指令行參數自動配置XML配置

在spring boot應用中,我們通常将主應用類放置于應用的根包中,例如,<code>com.javachen.example</code>。主應用類有main方法,并且使用了<code>@enableautoconfiguration</code>注解,并暗地裡定義了一個基礎的包路徑,spring boot會在該包路徑來搜尋類。例如,如果你正在編寫一個jpa應用,被<code>@enableautoconfiguration</code>注解的類所在包将被用來搜尋帶有<code>@entity</code>注解的實體類。

在主應用類上指定<code>@componentscan</code>,同樣也隐式的指定了掃描時basepackage的路徑。

說明:

<code>@restcontroller</code>和<code>@requestmapping</code>注解是spring mvc注解,它們不是spring boot的特定部分,具體檢視spring參考文檔的mvc章節。

<code>@enableautoconfiguration</code>這個注解告訴spring boot根據添加的jar依賴猜測你想如何配置spring。由于spring-boot-starter-web添加了tomcat和spring mvc,是以auto-configuration将假定你正在開發一個web應用并相應地對spring進行設定。

在該類上也可以使用<code>@configuration</code>注解,用來對spring boot進行配置,當然,你也可以使用一個xml源來調用<code>springapplication.run()</code>進行配置。

标有<code>@configuration</code>注解的類為配置類。你不需要将所有的<code>@configuration</code>放進一個單獨的類。<code>@import</code>注解可以用來導入其他配置類。另外,你也可以使用<code>@componentscan</code>注解自動收集所有的spring元件,包括<code>@configuration</code>類。

如果你需要使用基于xml的配置,你可以在注有<code>@configuration</code>的類上使用附加的<code>@importresource</code>注解加載xml配置檔案。

你可以通過将<code>@enableautoconfiguration</code>或<code>@springbootapplication</code>注解添加到一個<code>@configuration</code>類上來選擇自動配置。自動配置的意思是spring boot嘗試根據你添加的jar依賴自動配置你的spring應用。

如果需要找出目前應用了哪些自動配置及應用的原因,你可以使用<code>--debug</code>開關啟動應用,這将會記錄一個自動配置的報告并輸出到控制台。

如果發現應用了你不想要的特定自動配置類,你可以使用<code>@enableautoconfiguration</code>注解的排除屬性來禁用它們。

總結,上面提到了幾個注解,用途分别如下:

<code>@configuration</code>。标注一個類為配置類。

<code>@enableautoconfiguration</code>。開啟自動配置。

<code>@springbootapplication</code>。等價于以預設屬性使用<code>@configuration</code>,<code>@enableautoconfiguration</code>和<code>@componentscan</code>。

如果啟動類在根包下面,則你可以在該類上添加<code>@componentscan</code>注解而不需要添加任何參數,spring boot會在根包下面搜尋注有<code>@component</code>, <code>@service</code>, <code>@repository</code>,<code>@controller</code>注解的所有類,并将他們注冊為spring beans,否則,你需要在<code>@componentscan</code>注解上定義basepackages或者其他屬性。

這樣application.java可以定義為:

或者:

啟動類可以實作commandlinerunner接口,通過run方法處理main方法傳入的參數,并且你能夠使用<code>@value</code>注解将指令行參數傳入的值或者properties資源檔案中定義的值注入到程式中。例如,建立一個helloworldservice類:

并添加資源檔案application.properties:

修改application類為如下:

運作該類的main方法,則預設會輸出:

再次運作main方法,并傳入參數<code>--name=whatever</code>,則會輸出:

如果一些commandlinerunner beans被定義必須以特定的次序調用,你可以額外實作<code>org.springframework.core.ordered</code>接口或使用<code>@order</code>注解。

利用command-line runner的這個特性,再配合依賴注入,可以在應用程式啟動時後首先引入一些依賴bean,例如data source、rpc服務或者其他子產品等等,這些對象的初始化可以放在run方法中。不過,需要注意的是,在run方法中執行初始化動作的時候一旦遇到任何異常,都會使得應用程式停止運作,是以最好利用try/catch語句處理可能遇到的異常。

每個springapplication在退出時為了確定applicationcontext被優雅的關閉,将會注冊一個jvm的shutdown鈎子。所有标準的spring生命周期回調(比如,disposablebean接口或@predestroy注解)都能使用。

此外,如果beans想在應用結束時傳回一個特定的退出碼,可以實作<code>org.springframework.boot.exitcodegenerator</code>接口,例如上面例子中的exitexception異常類:

在啟動類上使用<code>@enableautoconfiguration</code>注解,就會開啟自動配置,簡單點說就是它會根據定義在classpath下的類,自動的給你生成一些bean,并加載到spring的context中。

它的神秘之處,不在于它能做什麼,而在于它會生成什麼樣的bean對于開發人員是不可預知(或者說不容易預知)。

例如,上面例子中引入了對spring-boot-starter-web的依賴,則會開啟spring mvc自動配置,觀察啟動日志,可以發現應用啟動了tomcat和spring mvc。

spring boot為spring mvc提供适用于多數應用的自動配置功能。在spring預設基礎上,自動配置添加了以下特性:

引入contentnegotiatingviewresolver和beannameviewresolver beans。

對靜态資源的支援,包括對webjars的支援。

自動注冊converter,genericconverter,formatter beans。

對httpmessageconverters的支援。

自動注冊messagecoderesolver。

對靜态index.html的支援。

對自定義favicon的支援。

再舉個例子:要開發一個基于spring jpa的應用,會涉及到下面三個bean的配置,datasource,entitymanagerfactory,platformtransactionmanager。

<code>@enablejparepositories</code>會查找滿足作為repository條件(繼承父類或者使用注解)的類。

<code>@enabletransactionmanagement</code>的作用:enables spring’s annotation-driven transaction management capability, similar to the support found in spring’s &lt;tx:*&gt; xml namespace。

但是,如果你使用了<code>@enableautoconfiguration</code>,那麼上面三個bean,你都不需要配置。在classpath下面隻引入了mysql的驅動和springjpa。

在生産環境中,資料庫連接配接可以使用datasource池進行自動配置。下面是選取一個特定實作的算法:

由于tomcat資料源連接配接池的性能和并發,在tomcat可用時,我們總是優先使用它。

如果hikaricp可用,我們将使用它。

如果commons dbcp可用,我們将使用它,但在生産環境不推薦使用它。

最後,如果commons dbcp2可用,我們将使用它。

如果你使用spring-boot-starter-jdbc或spring-boot-starter-data-jpa,你将會自動擷取對tomcat-jdbc的依賴。

datasource配置通過外部配置檔案的<code>spring.datasource.*</code>屬性控制。示例中,你可能會在<code>application.properties</code>中聲明下面的片段:

既然spring boot能夠從大多數資料庫的url上推斷出driver-class-name,那麼你就不需要再指定它了。對于一個将要建立的datasource連接配接池,我們需要能夠驗證driver是否可用,是以我們會在做任何事情之前檢查它。比如,如果你設定<code>spring.datasource.driverclassname=com.mysql.jdbc.driver</code>,然後這個類就會被加載。

spring的jdbctemplate和namedparameterjdbctemplate類是被自動配置的,你可以在自己的beans中通過<code>@autowire</code>直接注入它們。

如果資料源是jndi,則定義:

如果不想使用注解進行配置,則可以使用xml配置檔案,修改main方法如下:

meta-inf/application-context.xml檔案如下: