歡迎光臨
每天分享高質量文章

Spring Boot:自動配置

Spring Boot的自動配置給開發者帶來了很大的便利,當開發人員在pom檔案中添加starter依賴後,maven或者gradle會自動下載很多jar包到classpath中。當Spring Boot檢測到特定類的存在,就會針對這個應用做一定的配置,自動創建和織入需要的spring bean到程式背景關係中。

在之前的文章中,我們只是在pom檔案中增加各種starter的依賴,例如:spring-boot-starter-data-jpa, spring-boot-starter-web, spring-boot-starter-data-test等等。接下來將在之前的工程的基礎上,觀察在程式的引導啟動過程中,Spring Boot通過自動配置機制幫我們做了哪些工作。

How Do

  • Spring Boot啟動時將自動配置的信息通過DEBUG級別的日誌打印到控制台。可以通過設置環境變數(DEBUG)或者程式屬性(–debug)設置程式的日誌輸出級別。

  • 在專案目錄下運行 DEBUG=truemvn spring-boot:run啟動應用程式;

  • 在後臺可以看到DEBUG級別的日誌輸出,在啟動日誌的最後,可以看到類似AUTO-CONFIGURATION REPORT的字樣。 

分析

可以看到,後臺輸出的自動配置信息特別多,好幾頁屏幕,沒辦法一一分析,在這裡選擇一個postive match和negative match進行分析。

Spring Boot通過配置信息指出:特定配置項被選中的原因、列出匹配到對應類的配置項(positive match)、不包括某個配置項的原因(negative match)。現在以DataSourceAutoConfiguration舉例說明:

  • @ConditionalOnClass 表示對應的類在classpath目錄下存在時,才會去解析對應的配置檔案,對於DataSourceAutoConfiguration來說就是指:只有javax.sql.DataSource和org.springframwork.jdbc.datasource.embedded.EmbeddedDatabaseType類都能存在時,就會配置對應的資料庫資源。

  • @ConditionalOnMisssingClass表示對應的類在classpath目錄下找不到。

  • OnClassCondition用於表示匹配的型別(postive or negative)

OnClassCondition是最普遍的瀏覽探測條件,除此之外,Spring Boot也使用別的探測條件,如:OnBeanCondition用於檢測指定bean實體存在與否、OnPropertyCondition用於檢查指定屬性是否存在等等。

符合negative match代表一些配置類(xxxConfiguration之類的),它們雖然存在於classpath目錄,但是修飾它們的註解中依賴的其他類不存在。匯入如果在pom檔案中匯入spring-boot-autoconfigure包,則GsonAutoConfiguration就會出現在classpath目錄下,但是該配置類被 @ConditionalOnClass(Gson.class)修飾,而com.google.gson.Gson類不在classpath目錄。

  1. @Configuration

  2. @ConditionalOnClass({Gson.class})

  3. public class GsonAutoConfiguration {

  4.    public GsonAutoConfiguration() {

  5.    }

  6.    @Bean

  7.    @ConditionalOnMissingBean

  8.    public Gson gson() {

  9.        return new Gson();

  10.    }

  11. }

總結

  • @ConditionalOnClass:該註解的引數對應的類必須存在,否則不解析該註解修飾的配置類;

  • @ConditionalOnMissingBean:該註解表示,如果存在它修飾的類的bean,則不需要再創建這個bean;可以給該註解傳入引數例如 @ConditionOnMissingBean(name="example"),這個表示如果name為“example”的bean存在,這該註解修飾的代碼塊不執行。

參考資料

  1. Spring Boot實戰:自動配置原理分析

赞(0)

分享創造快樂