SpringBoot自動配置原理
微信搜索:碼農(nóng)StayUp
主頁地址:https://gozhuyinglong.github.io
源碼分享:https://github.com/gozhuyinglong/blog-demos
Spring Boot 的自動配置可以根據(jù)添加的jar依賴,自動配置 Spring Boot 應(yīng)用程序。例如,我們想要使用Redis,直接在POM文件中增加spring-boot-starter-data-redis依賴,然后我們配置下連接信息就可以使用了。
那么Spring Boot 是如何實現(xiàn)自動配置的呢?下面通過源碼分析,來看自動配置的原理。
源碼分析
@SpringBootApplication注解
我們知道在Spring Boot 項目中,都會有一個@SpringBootApplication注解,它標(biāo)識了該項目的啟動類。該注解是一個組合注解,其中有一個@EnableAutoConfiguration注解,用于啟用自動配置。

@EnableAutoConfiguration注解
我們進入@EnableAutoConfiguration注解可以看到,通過@Import注解導(dǎo)入了AutoConfigurationImportSelector類,從類名可以看出,該類是通過實現(xiàn)ImportSelector接口來導(dǎo)入配置類的。
在之前的《@Import注解:導(dǎo)入配置類的四種方式&源碼解析》文章中,介紹了@Import可以通過ImportSelector的方式導(dǎo)入配置類,建議選看一下。

AutoConfigurationImportSelector類
可以看出,該類實現(xiàn)了DeferredImportSelector接口。

那么該類是通過selectImports()方法導(dǎo)入配置類的,找到該方法。進入getAutoConfigurationEntry()方法。

該方法是獲取配置類的入口方法,我們進入getCandidateConfigurations()方法。

該方法用于獲取所有配置類的名字,最終是通過SpringFactoriesLoader加載器來獲取的。

SpringFactoriesLoader加載器
該類是 Spring 核心提供的一種類加載方式,用于加載資源文件META-INF/spring.factories中配置的類。loadFactoryNames()方法用于加載所有類的名字。

進入loadSpringFactories()靜態(tài)方法,用于加載資源文件META-INF/spring.factories中配置的類。加載的類會放到緩存中,下次會直接從緩存中獲取。

指定資源文件的名稱:META-INF/spring.factories

META-INF/spring.factories資源文件
該資源可能出現(xiàn)在多個JAR文件中,而自動配置類的資源文件位于spring-boot-autoconfigure包下。

這個資源文件中,包含了所有的自動配置類。文檔內(nèi)容必須是Properties格式,其中鍵是接口或抽象類的全類名,值是用逗號分隔的實現(xiàn)類列表,如下圖:

如何通過引入依賴實現(xiàn)自動配置的?
我們以JdbcTemplateAutoConfiguration配置類為例,看下配置類里到底做了什么,以及它是如何做到通過引入依賴的方式,來實現(xiàn)自動配置的。

其實也很簡單,配置類中主要使用了@ConditionalOnClass注解,該注解會判斷指定的類是否在classpath資源包內(nèi),如果都存在的話,才會構(gòu)建當(dāng)前配置類。
我們看到上圖中org.springframework.jdbc.core.JdbcTemplate類不存在,那么該配置類也不會被注入到IOC容器中,我們也就無法使用。
我們通過引入spring-boot-starter-data-jdbc依賴,那類也會被找到,配置類也就生效了。
這就是Spring Boot 自動配置的原理了~
