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

  對於SpringBoot中的屬性文件相信大傢在工作中用的是比較多的,對於application.properties和application.yml文件應該非常熟悉,但是對於bootstrap.properties文件和bootstrap.yml這個兩個文件用的估計就比較少瞭,用過的應該清楚bootstrap.properties中定義的文件信息會先與application.properties中的信息加載。而且大傢在使用的時候還經常碰到獲取不到bootstrap.properties中定義的信息的困擾,本文就來給大傢揭開這些謎團。

1.bootstrap的使用

  首先在SpringBoot中默認是不支持bootstrap.properties屬性文件的。我們需要映入SpringCloud的依賴才可以。

相關的版本環境

然後創建對應的bootstrap.properties文件,當然你也可以創建bootstrap.yml文件

同步的我們也會創建application.properties文件,其中會覆蓋一個屬性

然後我們在controller中獲取測試

訪問測試:http://localhost:8080/query

通過訪問看到bootstrap.properties中的信息獲取到瞭,同時age也被application.properties中的屬性覆蓋掉瞭。加載順序到底是什麼?為什麼會覆蓋呢?我們接下來分析。

2.bootstrap加載原理分析

  看本文之前最好看下我前面講解的SpringBoot中的監聽機制。

2.1 BootstrapApplicationListener

  在使用bootstrap.properties文件時我們需要映入相關的依賴

  其實在這個依賴中會在對應的spring.factories文件中給我們提供新的監聽器,也就是BootstrapApplicationListener監聽器。

  而BootstrapApplicationListener監聽觸發的事件是ApplicationEnvironmentPreparedEvent事件,這個事件其實和我們前面介紹監聽application.properties的時候的監聽器ConfigFileApplicationListener監聽的是同一個事件。

  如果你看瞭前面的文章,那麼此處你會覺得有點眉目瞭。也就是當啟動的時候發佈對應的事件,該監聽器會觸發相關的解析行為。

2.2 啟動流程梳理

  搞清楚瞭監聽器的關系後,我們來看下啟動的流程代碼具體是怎麼執行的。

直接進入

在SpringApplication的構造方法中我們要註意兩點,1.監聽器的加載 2.main方法的主類記錄

然後回來進入run方法

Debug到第一個端點。

然後我們放過。

GIF.gif

通過上面的動圖可以看到又進入瞭一次這個run方法。先看處理的結果。

然後我們再放過,繼續

分兩次加載,有先右後哦。那麼這裡面的第一個加載的原理到底是什麼呢?繼續來分析。

2.3 bootstrap.properties的加載原理

  接下來看看是如果出現的一個父context來優先加載我們的bootstrap.properteis文件的,還是從這個圖開始

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

跳過非關鍵的,直接進入到BootstrapApplicationListener中來看。

然後進入到 bootstrapServiceContext方法中。

這兒我們看到有創建瞭一個SpringApplication對象。這個其實就是父Context對象瞭。

進入run方法你會發現,回到瞭前面

到這應該就清楚瞭執行的核心流程瞭,至於是如何加載的屬性文件的內容,參考我的上篇文章哦。

到此這篇關於SpringBoot源碼分析之bootstrap.properties文件加載的原理的文章就介紹到這瞭,更多相關SpringBoot源碼分析文件加載的原理內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: