從SpringBoot原始碼分析 主程式配置類載入過程

阿福聊程式設計發表於2020-06-03

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類,跟蹤程式碼:

image-20200524204538302

從原始碼中可以看出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各種技術文章。

相關文章