從SpringBoot源碼分析 主程序配置類加載過程


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM