SpringBoot源碼分析之bootstrap.properties文件加載的原理

??對(duì)于SpringBoot中的屬性文件相信大家在工作中用的是比較多的,對(duì)于application.properties和application.yml文件應(yīng)該非常熟悉,但是對(duì)于bootstrap.properties文件和bootstrap.yml這個(gè)兩個(gè)文件用的估計(jì)就比較少了,用過的應(yīng)該清楚bootstrap.properties中定義的文件信息會(huì)先與application.properties中的信息加載。而且大家在使用的時(shí)候還經(jīng)常碰到獲取不到bootstrap.properties中定義的信息的困擾,本文就來給大家揭開這些謎團(tuán)。
1.bootstrap的使用
??首先在SpringBoot中默認(rèn)是不支持bootstrap.properties屬性文件的。我們需要映入SpringCloud的依賴才可以。

相關(guān)的版本環(huán)境


然后創(chuàng)建對(duì)應(yīng)的bootstrap.properties文件,當(dāng)然你也可以創(chuàng)建bootstrap.yml文件

同步的我們也會(huì)創(chuàng)建application.properties文件,其中會(huì)覆蓋一個(gè)屬性

然后我們?cè)赾ontroller中獲取測(cè)試

訪問測(cè)試:http://localhost:8080/query

通過訪問看到bootstrap.properties中的信息獲取到了,同時(shí)age也被application.properties中的屬性覆蓋掉了。加載順序到底是什么?為什么會(huì)覆蓋呢?我們接下來分析。
2.bootstrap加載原理分析
??看本文之前最好看下我前面講解的SpringBoot中的監(jiān)聽機(jī)制。
2.1 BootstrapApplicationListener
??在使用bootstrap.properties文件時(shí)我們需要映入相關(guān)的依賴

??其實(shí)在這個(gè)依賴中會(huì)在對(duì)應(yīng)的spring.factories文件中給我們提供新的監(jiān)聽器,也就是BootstrapApplicationListener監(jiān)聽器。

??而BootstrapApplicationListener監(jiān)聽觸發(fā)的事件是ApplicationEnvironmentPreparedEvent事件,這個(gè)事件其實(shí)和我們前面介紹監(jiān)聽application.properties的時(shí)候的監(jiān)聽器ConfigFileApplicationListener監(jiān)聽的是同一個(gè)事件。


??如果你看了前面的文章,那么此處你會(huì)覺得有點(diǎn)眉目了。也就是當(dāng)啟動(dòng)的時(shí)候發(fā)布對(duì)應(yīng)的事件,該監(jiān)聽器會(huì)觸發(fā)相關(guān)的解析行為。
2.2 啟動(dòng)流程梳理
??搞清楚了監(jiān)聽器的關(guān)系后,我們來看下啟動(dòng)的流程代碼具體是怎么執(zhí)行的。


直接進(jìn)入

在SpringApplication的構(gòu)造方法中我們要注意兩點(diǎn),1.監(jiān)聽器的加載 2.main方法的主類記錄

然后回來進(jìn)入run方法


Debug到第一個(gè)端點(diǎn)。

然后我們放過。

通過上面的動(dòng)圖可以看到又進(jìn)入了一次這個(gè)run方法。先看處理的結(jié)果。

然后我們?cè)俜胚^,繼續(xù)

分兩次加載,有先右后哦。那么這里面的第一個(gè)加載的原理到底是什么呢?繼續(xù)來分析。
2.3 bootstrap.properties的加載原理
??接下來看看是如果出現(xiàn)的一個(gè)父context來優(yōu)先加載我們的bootstrap.properteis文件的,還是從這個(gè)圖開始


鏈路如上面一步步跟蹤即可。

跳過非關(guān)鍵的,直接進(jìn)入到BootstrapApplicationListener中來看。

然后進(jìn)入到 bootstrapServiceContext方法中。

這兒我們看到有創(chuàng)建了一個(gè)SpringApplication對(duì)象。這個(gè)其實(shí)就是父Context對(duì)象了。

進(jìn)入run方法你會(huì)發(fā)現(xiàn),回到了前面


到這應(yīng)該就清楚了執(zhí)行的核心流程了,至于是如何加載的屬性文件的內(nèi)容,參考我的上篇文章哦。
到此這篇關(guān)于SpringBoot源碼分析之bootstrap.properties文件加載的原理的文章就介紹到這了,更多相關(guān)SpringBoot源碼分析文件加載的原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 數(shù)據(jù)校驗(yàn)@Valid+統(tǒng)一異常處理的實(shí)現(xiàn)
這篇文章主要介紹了Spring Boot 數(shù)據(jù)校驗(yàn)@Valid+統(tǒng)一異常處理的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04
java教程之對(duì)象序列化使用基礎(chǔ)示例詳解
所謂對(duì)象序列化就是將對(duì)象的狀態(tài)轉(zhuǎn)換成字節(jié)流,以后可以通過這些值再生成相同狀態(tài)的對(duì)象,下面詳細(xì)介紹一下java對(duì)象的序列化使用方法2014-01-01
SpringBoot文件上傳同時(shí)接收復(fù)雜參數(shù)的過程詳解
這篇文章主要介紹了SpringBoot文件上傳同時(shí),接收復(fù)雜參數(shù),本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
java ssm框架實(shí)現(xiàn)分頁功能的示例代碼(oracle)
這篇文章主要介紹了java ssm框架實(shí)現(xiàn)分頁功能的示例代碼(oracle),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
java集合中HashSet LinkedHashSet TreeSet三者異同面試精講
這篇文章主要為大家介紹了java集合中HashSet LinkedHashSet TreeSet三者異同面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
String轉(zhuǎn)BigDecimal,BigDecimal常用操作,以及避免踩坑記錄
這篇文章主要介紹了String轉(zhuǎn)BigDecimal,BigDecimal常用操作,以及避免踩坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07

