天天看點

了解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通過自動配置機制幫我們做了哪些工作。

spring boot啟動時将自動配置的資訊通過debug級别的日志列印到控制台。可以通過設定環境變量(debug)或者程式屬性(--debug)設定程式的日志輸出級别。

在項目目錄下運作<code>debug=true mvn spring-boot:run</code>啟動應用程式;

在背景可以看到debug級别的日志輸出,在啟動日志的最後,可以看到類似auto-configuration report的字樣。

了解Spring Boot的自動配置

positive matches

了解Spring Boot的自動配置

negative matches

可以看到,背景輸出的自動配置資訊特别多,好幾頁螢幕,沒辦法一一分析,在這裡選擇一個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目錄下,但是該配置類被<code>@conditionalonclass(gson.class)</code>修飾,而com.google.gson.gson類不在classpath目錄。

@conditionalonclass:該注解的參數對應的類必須存在,否則不解析該注解修飾的配置類;

@conditionalonmissingbean:該注解表示,如果存在它修飾的類的bean,則不需要再建立這個bean;可以給該注解傳入參數例如<code>@conditiononmissingbean(name = "example")</code>,這個表示如果name為“example”的bean存在,這該注解修飾的代碼塊不執行。

<a href="http://blog.csdn.net/liaokailin/article/details/49559951" target="_blank">spring boot實戰:自動配置原理分析</a>