1、@Import(AutoConfigurationPackages.Registrar.class)
初始SpringBoot 我們知道在SpringBoot 啟動類上有一個@SpringBootApplication註解,配置類的載入就是從這裡開始(源頭),一起走起。
@SpringBootApplication是一個複合註解,其中包括Java元註解(@Target,@Retention,@Documented,@Inherited),不清楚註解的小夥伴可以參考Java註解,其實就這麼簡單這篇部落格學習
@ComponentScan 包掃描元件
@EnableAutoConfiguration,告訴SpringBoot開啟自動配置功能,我們之前需要配置的東西,現在都不需要了,SpringBoot 都幫我們做了。
接下來我們主要將一下@EnableAutoConfiguration這個註解中@AutoConfigurationPackage是自動配置包
在@AutoConfigurationPackage包裡有@Import(AutoConfigurationPackages.Registrar.class)的註解,@Import是Spring的底層註解,表示給容器中匯入一個元件;匯入的元件由AutoConfigurationPackages.Registrar.class決定。
在AutoConfigurationPackages下面的registerBeanDefinitions 方法,獲取主配置類下所有包及子包的元件匯入到Spring 容器當中。
重點@Import(AutoConfigurationPackages.Registrar.class)
上面分析了那麼多,可能有的小夥伴們不知道我在幹嘛?,其實整個過程主要是實現是將主配置類(@SpringBootApplication)標註的所有包及子包裡面的所有元件掃描到Spring容器當中。
也許有初始SpringBoot 的小夥伴們會遇到這樣的問題,就是專案啟動了,訪問頁面回出現404,那我下面舉例說明一下,你可能就明白了。
細節說明:比如我定義一個UserController類, 但是這個類不在SpringBoot 的主配置的目錄下面
專案結構圖及實現類
@RestController
public class UserController {
@RequestMapping("/helloTest")
public String helloTest(){
return "hello";
}
}
頁面訪問:頁面顯示404
所以綜合我們前面提到了,在使用SpringBoot 開發專案的時候,建立類的時候需要在(@SpringBootApplication)標註的所有包及子包裡面建立,這樣是SpringBoot 就能把所有的元件加入到Spring容器當中。
2、@Import(AutoConfigurationImportSelector.class)
AutoConfigurationImportSelector類,跟蹤程式碼:
從原始碼中可以看出SpringBoot 在啟動的時候從類路徑下的 META-INF/spring.factores 中獲取EnableAutoConfiguration指定的值,將這些作為自動配置類匯入到容器當中,自動配置類就生效,幫我們進行自動配置的工作。
關鍵功能由@Import提供,其匯入的AutoConfigurationImportSelector的selectImports()方法通過SpringFactoriesLoader.loadFactoryNames()掃描所有具有META-INF/spring.factories的jar包。spring-boot-autoconfigure-x.x.x.x.jar裡就有一個這樣的spring.factories檔案.
3、小結
(1)、 @Import(AutoConfigurationPackages.Registrar.class),實現是將主配置類(@SpringBootApplication)標註的所有包及子包裡面的所有元件掃描到Spring容器當中。
(2)、 @Import(AutoConfigurationImportSelector.class),實現的是SpringBoot 在啟動的時候從類路徑下的 META-INF/spring.factores 中獲取EnableAutoConfiguration指定的值,將這些作為自動配置類匯入到容器當中,自動配置類就生效,幫我們進行自動配置的工作。
由於本人能力有限,若文章有錯誤的地方,請大家指出,一起交流學習。今天就和大家講到這裡,喜歡我的小夥伴們,動動你的小手點個關注唄。
歡迎大家關注我的公眾號:阿福聊程式設計,長期更新Java各種技術文章。