最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot自動(dòng)裝配原理及配置流程

 更新時(shí)間:2025年08月06日 09:10:13   作者:貳拾wan  
SpringBoot通過(guò)@SpringBootApplication注解,結(jié)合配置文件與@Conditional條件,自動(dòng)識(shí)別并加載Bean,實(shí)現(xiàn)簡(jiǎn)化配置與環(huán)境適配,本文給大家介紹SpringBoot自動(dòng)裝配原理及配置流程,感興趣的朋友一起看看吧

SpringBoot的自動(dòng)裝配是其核心特性之一,他簡(jiǎn)化了Spring應(yīng)用的配置流程,實(shí)現(xiàn)了“約定大于配置”的理念。其核心原理可以概括為:通過(guò)特定的注解和配置文件,自動(dòng)識(shí)別并加載符合條件的Bean到Spring容器中。

1.核心注解:@SpringBootApplication

自動(dòng)裝配的入口是主類上的@SpringBootApplication注解,它是一個(gè)符合注解,包含三個(gè)關(guān)鍵注解:

  • @SpringBootConfiguration:標(biāo)記當(dāng)前類為配置類(本質(zhì)上是@Configuration的派生注解)
  • @ComponentScan:掃描當(dāng)前包及其子包下的@Component,@Service等注解的類,注冊(cè)為Bean。
  • @EnableAutoConfiguration:開(kāi)啟自動(dòng)配置的核心注解,也是自動(dòng)裝配的關(guān)鍵。

2.@EnableAutoConfiguration的作用

當(dāng)我們點(diǎn)進(jìn)去這個(gè)核心注解的時(shí)候:

 EnableAutoConfiguration注解實(shí)現(xiàn)自動(dòng)裝配機(jī)制的時(shí)候,主要依賴于這個(gè)@Import({AutoConfigurationImportSelector.class}),通過(guò)import的導(dǎo)入到AutoConfigurationImportSelector類,該類負(fù)責(zé)篩選并導(dǎo)入需要自動(dòng)裝配的類。其中這個(gè)類的話實(shí)現(xiàn)自動(dòng)裝配依賴于selectImports()這個(gè)方法。

這個(gè)方法通過(guò)在內(nèi)部調(diào)用getAutoConfigurationEntry方法來(lái)實(shí)現(xiàn)自動(dòng)裝配。

 getCandidateConfigurations()這個(gè)方法會(huì)告訴要想將沒(méi)有spingbootapplication注解啟動(dòng)的類,但是想讓spring幫助我們進(jìn)行注冊(cè)Bean需要將類的全限定名加到某個(gè)文件中。

 getCandidateConfigurations()這個(gè)方法具體實(shí)現(xiàn):

    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = ImportCandidates.load(AutoConfiguration.class, this.getBeanClassLoader()).getCandidates();
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

也就是將需要注冊(cè)的類全限定名寫入到這個(gè)文件中。

舉一個(gè)例子:

我們?cè)诹硗庖粋€(gè)工程里面封裝了redis的一些方法以及redis的相關(guān)配置。希望能夠在外部中引用RedisService這個(gè)對(duì)象。但是這個(gè)工程中并沒(méi)有springbootapplication啟動(dòng)注解。所以將這個(gè)類的全限定名寫入到以上這個(gè)文件中。

有兩點(diǎn)需要進(jìn)行注意:

一是一般這個(gè)文件創(chuàng)建在resources這個(gè)目錄下,META-INF和spring這是兩個(gè)目錄,先創(chuàng)建META-INF目錄再創(chuàng)建spring目錄。同時(shí)在創(chuàng)建的時(shí)候需要打開(kāi)一個(gè)東西。 

把compact給取消掉。是因?yàn)樵诠催x上的話,創(chuàng)建的話不容易看出這是一個(gè)二級(jí)目錄,我們想要的效果就是達(dá)到以下圖片的效果。 

3.詳細(xì)解讀getAutoConfigurationEntry()

if (!this.isEnabled(annotationMetadata)) {
    return EMPTY_ENTRY;
}

首先判斷自動(dòng)配置功能是否開(kāi)啟。

isEnabled()方法會(huì)檢查屬性@EnableAutofiguration注解的enabled屬性(默認(rèn)為true),也可能結(jié)合其他全局開(kāi)關(guān)。如果返回false的,表示關(guān)閉自動(dòng)配置,直接返回空結(jié)果。

AnnotationAttributes attributes = this.getAttributes(annotationMetadata);

從注解元數(shù)據(jù)AnnotationMetadata中提取@EnableAutoConfiguration的屬性信息。

@EnableAutoConfiguration有exclude,excludeName等屬性(用于指定需要排除的自動(dòng)配置類),getAttributes()會(huì)將這些屬性解析為AnnotationAttribute對(duì)象,方便后續(xù)處理。

List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);

獲取所有候選自動(dòng)配置類的全限定名

getCandidateConfigurations()方法會(huì)讀取類路徑下 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中,以org.springframework.boot.autoconfigure.EnableAutoConfiguration為key的所有值(這些值就是Spring Boot預(yù)定義的自動(dòng)配置類,如WebMvcAutConfiguration等。

configurations = this.removeDuplicates(configurations);

 對(duì)候選配置類去重,避免同一個(gè)配置類被多次加載。

如果多個(gè) META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件定義了同一個(gè)自動(dòng)配置類,這里確保最終只保留一個(gè)。

Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);

 收集所有需要排除的自動(dòng)配置類

@EnableAutoConfiguration注解的exclude屬性(直接指定類)或者是excludeName屬性指定類名。還可以通過(guò)配置文件application.yaml中通過(guò)spring.autoconfigure.exclude配置的類。

this.checkExcludedClasses(configurations, exclusions);

檢查需要排除的類是否確實(shí)存在于候選配置類中。

如果用戶排除了一個(gè)不存在的自動(dòng)配置類(如拼寫錯(cuò)誤),這里會(huì)拋出異常(illegalArgumentException),提前暴露配置錯(cuò)誤。

configurations.removeAll(exclusions);

將需要排除的類從候選配置類列表中徹底移除。

被排除的類不會(huì)被Spring容器加載,實(shí)現(xiàn)了“自定義排除不需要的自動(dòng)配置”的功能。

configurations = this.getConfigurationClassFilter().filter(configurations);

 通過(guò)條件過(guò)濾器篩選出符合當(dāng)前環(huán)境的配置類。

過(guò)濾器會(huì)檢查每個(gè)候選配置類上的@Conditional系類注解(如@ConditionalOnClass,@ConditionalOnMissingBean等),只有滿足所有條件的配置類才會(huì)被保留。

this.fireAutoConfigurationImportEvents(configurations, exclusions);

觸發(fā)自動(dòng)配置導(dǎo)入事件,通知相關(guān)監(jiān)聽(tīng)器(AutoConfigurationImportListenter)。

允許外部自動(dòng)配置進(jìn)行擴(kuò)展(如日志記錄,額外處理等)。

return new AutoConfigurationEntry(configurations, exclusions);

 將篩選后的有效配置類和排除類封裝為AutoConfigurationEntry對(duì)象并返回。

Spring 容器會(huì)根據(jù)該結(jié)果,將configurations中的類作為類加載,從而完成自動(dòng)裝配。

總結(jié):

1.先檢查開(kāi)關(guān),確保自動(dòng)配置啟用

2.加載預(yù)定義的候選配置類

3.處理去重和排除,移除不需要的類

4.通過(guò)@Conditional注解篩選符合當(dāng)前環(huán)境的類

5.發(fā)布事件并返回結(jié)果

最終,篩選后的配置類會(huì)被Spring容器加載,其內(nèi)部定義的@Bean方法會(huì)生成相應(yīng)的Bean,實(shí)現(xiàn)自動(dòng)配置的效果。

到此這篇關(guān)于SpringBoot自動(dòng)裝配原理及配置流程的文章就介紹到這了,更多相關(guān)SpringBoot自動(dòng)裝配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java 實(shí)現(xiàn)Excel文檔添加超鏈接的代碼

    Java 實(shí)現(xiàn)Excel文檔添加超鏈接的代碼

    超鏈接即內(nèi)容鏈接,通過(guò)給特定對(duì)象設(shè)置超鏈接,可實(shí)現(xiàn)載體與特定網(wǎng)頁(yè)、文件、郵件、網(wǎng)絡(luò)等的鏈接,點(diǎn)擊鏈接載體可打開(kāi)鏈接目標(biāo),在文檔處理中是一種比較常用的功能,本文將介紹通過(guò)Java程序給Excel文檔添加超鏈接的方法,感興趣的朋友一起看看吧
    2020-02-02
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(21)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(21)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-07-07
  • Java非侵入式API接口文檔工具apigcc用法詳解

    Java非侵入式API接口文檔工具apigcc用法詳解

    這篇文章主要介紹了Java非侵入式API接口文檔工具apigcc用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 手寫redis@Cacheable注解?支持過(guò)期時(shí)間設(shè)置方式

    手寫redis@Cacheable注解?支持過(guò)期時(shí)間設(shè)置方式

    這篇文章主要介紹了手寫redis@Cacheable注解?支持過(guò)期時(shí)間設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java 歸并排序的實(shí)例詳解

    java 歸并排序的實(shí)例詳解

    這篇文章主要介紹了java 歸并排序的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Java中的Map集合簡(jiǎn)單匯總解析

    Java中的Map集合簡(jiǎn)單匯總解析

    這篇文章主要介紹了Java中的Map集合簡(jiǎn)單匯總解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • JWT令牌的工作原理詳解

    JWT令牌的工作原理詳解

    這篇文章主要介紹了JWT令牌的工作原理詳解,在認(rèn)證的時(shí)候,當(dāng)用戶用他們的的憑證成功登錄以后,一個(gè)JSON?Web?Token將會(huì)被返回,此后,用戶名和密碼就不再是用戶的憑證,而token是用戶用來(lái)訪問(wèn)資源的新憑證了,需要的朋友可以參考下
    2023-08-08
  • java如何獲取兩個(gè)List集合之間的交集、差集、并集

    java如何獲取兩個(gè)List集合之間的交集、差集、并集

    在日常開(kāi)發(fā)中經(jīng)常會(huì)遇到對(duì)2個(gè)集合的操作,例如2個(gè)集合之間取相同的元素(交集),2個(gè)集合之間取不相同的元素(差集)等等,這篇文章主要給大家介紹了關(guān)于java如何獲取兩個(gè)List集合之間的交集、差集、并集的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • SpringBoot集成Beetl后統(tǒng)一處理頁(yè)面異常的方法

    SpringBoot集成Beetl后統(tǒng)一處理頁(yè)面異常的方法

    這篇文章主要介紹了SpringBoot集成Beetl后統(tǒng)一處理頁(yè)面異常的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 使用Post方法模擬登陸爬取網(wǎng)頁(yè)的實(shí)現(xiàn)方法

    使用Post方法模擬登陸爬取網(wǎng)頁(yè)的實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇使用Post方法模擬登陸爬取網(wǎng)頁(yè)的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03

最新評(píng)論

恭城| 巴楚县| 泾川县| 界首市| 扬中市| 济源市| 金阳县| 孝义市| 来凤县| 泗阳县| 栖霞市| 黔西县| 大名县| 普陀区| 淮阳县| 新兴县| 黎平县| 凌海市| 丹巴县| 剑河县| 浦县| 偏关县| 侯马市| 体育| 肇州县| 邮箱| 扶风县| 东莞市| 华亭县| 家居| 蒲江县| 柘荣县| 敦化市| 龙门县| 陆良县| 垦利县| 五台县| 遂溪县| 北安市| 宜昌市| 重庆市|