Spring Boot的自動(dòng)配置給開發(fā)者帶來了很大的便利,當(dāng)開發(fā)人員在pom文件中添加starter依賴后,maven或者gradle會(huì)自動(dòng)下載很多jar包到classpath中。當(dāng)Spring Boot檢測(cè)到特定類的存在,就會(huì)針對(duì)這個(gè)應(yīng)用做一定的配置,自動(dòng)創(chuàng)建和織入需要的spring bean到程序上下文中。
在之前的文章中,我們只是在pom文件中增加各種starter的依賴,例如:spring-boot-starter-data-jpa, spring-boot-starter-web, spring-boot-starter-data-test等等。接下來將在之前的工程的基礎(chǔ)上,觀察在程序的引導(dǎo)啟動(dòng)過程中,Spring Boot通過自動(dòng)配置機(jī)制幫我們做了哪些工作。
DEBUG=true mvn spring-boot:run
啟動(dòng)應(yīng)用程序;http://wiki.jikexueyuan.com/project/spring-boot-cookbook-zh/images/cd.png" alt="Positive matches" />
http://wiki.jikexueyuan.com/project/spring-boot-cookbook-zh/images/7.png" alt="Negative matches" />
可以看到,后臺(tái)輸出的自動(dòng)配置信息特別多,好幾頁(yè)屏幕,沒辦法一一分析,在這里選擇一個(gè)postive match和negative match進(jìn)行分析。
Spring Boot通過配置信息指出:特定配置項(xiàng)被選中的原因、列出匹配到對(duì)應(yīng)類的配置項(xiàng)(positive match)、不包括某個(gè)配置項(xiàng)的原因(negative match)。現(xiàn)在以DataSourceAutoConfiguration舉例說明:
OnClassCondition是最普遍的瀏覽探測(cè)條件,除此之外,Spring Boot也使用別的探測(cè)條件,如:OnBeanCondition用于檢測(cè)指定bean實(shí)例存在與否、OnPropertyCondition用于檢查指定屬性是否存在等等。
符合negative match代表一些配置類(xxxConfiguration之類的),它們雖然存在于classpath目錄,但是修飾它們的注解中依賴的其他類不存在。導(dǎo)入如果在pom文件中導(dǎo)入spring-boot-autoconfigure包,則GsonAutoConfiguration就會(huì)出現(xiàn)在classpath目錄下,但是該配置類被@ConditionalOnClass(Gson.class)
修飾,而com.google.gson.Gson類不在classpath目錄。
@Configuration
@ConditionalOnClass({Gson.class})
public class GsonAutoConfiguration {
public GsonAutoConfiguration() {
}
@Bean
@ConditionalOnMissingBean
public Gson gson() {
return new Gson();
}
}
@ConditionOnMissingBean(name = "example")
,這個(gè)表示如果name為“example”的bean存在,這該注解修飾的代碼塊不執(zhí)行。