SpringBoot自動配置原理

image.png

官方解釋Springboot:我們對Spring平臺和第三方庫持固執(zhí)己見的觀點,因此您可以以最小的麻煩開始使用。大多數(shù)Spring Boot應用程序需要最少的Spring配置。

為何springboot可以如此便攜,則來源于springboot的自動配置,接下來講解原理。如集成redis來說。

從啟動類@SpringBootApplication入手


image.png

而此注解下的@EnableAutoConfiguration注解則是自動配置注解。


image.png

通過注解再點擊


image.png

發(fā)現(xiàn)有一個select選擇器
image.png

而此選擇器最終會有一個configuration數(shù)組被返回。

而這個數(shù)組則是通過掃描一個spring.factory來獲取的
通過下面代碼發(fā)現(xiàn):

 protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

//最后追溯到這里

image.png

結論:springboot自動配置是尋找項目下的spring.factories的文件來實現(xiàn)自動配置

現(xiàn)在,我們找一個redis的factories來看看。
image.png

點進此類查看

@Configuration(     //申明配置類
    proxyBeanMethods = false
)
//判斷有無RedisOperations這個類
@ConditionalOnClass({RedisOperations.class})
//配置這個類的參數(shù)在RedisProperties.class查找
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
    public RedisAutoConfiguration() {

通過作者代碼注釋,我們可以總結:
此類的注解:
1: 申明是一個配置類
2:判斷是否存在RedisOperations ,存在則開始自動注入
3: 自動配置的參數(shù)在RedisProperties.class中查找

點擊 RedisProperties進入

image.png

@ConfigurationProperties判斷配置文件有無spring.redis這個前綴。有的話則繼續(xù)查找參數(shù)注入。如:spring.redis.port

所以:當我們在集成redis的時候,只需要導入redis的jar包,并在application.yml下配置了spring.redis.下的參數(shù)(如:spring.redis.port 指定端口)。
1:那么springboot會掃描項目是否導入了redis的jar包,則就是剛才的(判斷有無RedisOperations這個類)
2:springboot則會去application.yml查找是否添加了spring.redis開頭的配置。有則在初始化redis的時候將配置加載進去。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容