SpringBoot工作機制之@SpringBootApplication
@SpringBootApplication
使用IDEA快速構建一個SpringBoot專案,使用的SpringBoot版本為2.1.6.RELEASE
@SpringBootApplication是一個複合的註解,但實際上對於SpringBoot應用來說,重要的只有三個@Configuration
@EnableAutoConfiguration
@ComponentScan
所以如果我們使用如下的SpringBoot啟動類,整個SpringBoot應用依然可以與之前的啟動類功能對等。
@Configuration
這裡的@Configuration,它就是Spring IoC容器的配置類使用的那個@Configuration,既然SpringBoot應用骨子裡就是一個Spring引用,自然也需要載入某個IoC容器的配置,這裡啟動類標註了@Configuration之後,本身其實也是一個IoC容器的配置類!很多SpringBoot的程式碼示例都喜歡在啟動類上直接標註@Configuration或者@SpringBootApplication,對於初接觸SpringBoot的開發者來說,其實這種做法不便於理解,如果我們將上面的SpringBoot啟動類拆分為兩個獨立的Java類,整個形式就明朗了:
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoConfiguration.class,args);
}
}
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class DemoConfiguration(){
@Bean
public Controller controller(){
return new Controller();
}
}
複製程式碼
所以,啟動類DemoApplication就是一個標準的main函式啟動類,而@Configuration標註的DemoConfiguration定義其實也是一個普通的JavaConfig形式的IoC容器配置類,全是Spring框架的概念。
@EnableAutoConfiguration
@EnableAutoConfiguration類似於Spring框架中的提供的各種以@Enable的註解,比如@EnableScheduling、@EnableMBeanExport等,都是藉助@Import的支援,收集和註冊特定場景相關的bean定義:
- @EnableScheduling是通過@Import將Spring排程框架相關的bean定義都載入到IoC容器。
- @EnableMBeanExport是通過@Import將JMX相關的bean定義載入到IoC容器。
而@EnableAutoConfiguration也是藉助@Import的幫助,將所有符合自動配置條件的bean定義載入到IoC容器。
最關鍵的是@Import(AutoConfigurationImportSelector.class)
,藉助AutoConfigurationImportSelector,@EnableAutoConfiguration可以幫助SpringBoot應用將所有符合條件的@Configuration配置都載入到當前SpringBoot建立並使用的IoC容器。那麼,AutoConfigurationImportSelector又是如何載入的呢?
檢視AutoConfigurationImportSelector類的原始碼,它依賴於SpringFactoriesLoader的loadFactoryNames方法,來獲取一組自動配置類名。
自動配置的幕後英雄:SpringFactoriesLoader
它的主要功能就是從指定的配置檔案META-INF/spring.factories載入配置,配置的格式為Key = Value形式,只不過key和value都是Java型別的完整類名,比如:
example.MyServer=example.MyServerImpl1,example.MyServerImpl2
複製程式碼
然後框架就可以根據某個型別作為Key來查詢對應的型別名稱列表了,對於AutoConfigurationImportSelector來說,即根據@EnableAutoConfiguration的完整類名org.springframework.boot.autoconfigure.EnableAutoConfiguration作為查詢的Key,獲取對應一組@Configuration類:
以上是從SpringBoot的autoconfigure依賴包中的META-INF/spring.factories配置檔案中擷取的一部分內容,可以很好的說明問題。
所以,@EnableAutoConfiguration自動配置就是從classpath中搜索所有META-INF/spring.factories配置檔案,並將其中org.springframework.boot.autoconfigure.EnableAutoConfiguration對應的配置項通過反射例項化對應的@Configuration的JavaConfig形式的IoC容器配置類,然後彙總為一個並載入到IoC容器。
@ComponentScan
@ComponentScan對應XML配置形式中的<context:component-scan>
元素,用於配合@Component和@Repository等註解,將標註了這些註解的bean定義類批量採集到Spring的IoC容器中。
我們可以通過basePackages等屬性來細粒度地定製@ComponentScan自動掃描的範圍,如果不指定,則預設Spring框架實現會從宣告@ComponentScan所在類的package進行掃描。
參考資料《SpringBoot揭祕 快速構建微服務體系》