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各種技術文章。