Spring Boot 配置文件的加載優(yōu)先級
1. 前言
今天突發(fā)奇想,如果Spring Boot的配置文件同時存在application.properties和application.yaml,于是便測試了一波。結(jié)果測出來優(yōu)先級的順序為?properties>yaml。大部分情況下我們并不會這兩種類型的配置混用,但是不免一些面試官會拿這個刁難你,所以要有個印象。但是Spring Boot配置文件位置的優(yōu)先級還是經(jīng)常用的,所以今天就總結(jié)一波。
本文基于Spring Boot 2.3.3.RELEASE
2. 配置文件加載順序
在Spring Boot中,配置文件監(jiān)聽器ConfigFileApplicationListener用來處理加載配置文件邏輯,關(guān)鍵的加載邏輯優(yōu)先級是下面這段代碼
private?Set?getSearchLocations()? {
????//?CONFIG_ADDITIONAL_LOCATION_PROPERTY?=?"spring.config.additional-location"
???Set?locations?=?getSearchLocations(CONFIG_ADDITIONAL_LOCATION_PROPERTY);
????//?CONFIG_LOCATION_PROPERTY?=?"spring.config.location"
???if?(this.environment.containsProperty(CONFIG_LOCATION_PROPERTY))?{
??????locations.addAll(getSearchLocations(CONFIG_LOCATION_PROPERTY));
???}
???else?{
??????locations.addAll(
????//?DEFAULT_SEARCH_LOCATIONS?=?"classpath:/,classpath:/config/,file:./,file:./config/*/,file:./config/"
????????????asResolvedSet(ConfigFileApplicationListener.this.searchLocations,?DEFAULT_SEARCH_LOCATIONS));
???}
???return?locations;
}
在任何情況下配置項spring.config.additional-location下的配置文件都會被先加載,如果我們指定了Spring Boot的配置路徑spring.config.location(通常我們會通過命令行指定這個參數(shù)),就會從這個指定路徑加載配置文件;如果沒有指定spring.config.location那么就會從下面路徑從上到下進行優(yōu)先加載:
file:./config/

file:./config/*/

file:./

classpath:/config/

classpath:/

3. 誤區(qū)
這里容易產(chǎn)生一個誤區(qū),文件之間的優(yōu)先級是這樣的。當(dāng)application.properties和application.yaml進行優(yōu)先級加載時,它們都會加載,并不是application.properties加載了application.yaml就不加載了,而是它們的內(nèi)容根據(jù)優(yōu)先級的高低進行合并。

同樣地當(dāng)根據(jù)DEFAULT_SEARCH_LOCATIONS路徑進行優(yōu)先級的時候它們也是同樣的機制進行合并的。這一點我們一定要明白。
優(yōu)先級指的是,配置文件都會加載,相同屬性根據(jù)優(yōu)先級高低進行合并。
4. 總結(jié)
Spring Boot?配置文件加載機制是一個很重要的考察點,在日常的配置擴展、多環(huán)境、運維部署都非常重要,也是面試經(jīng)常問的知識點,需要學(xué)習(xí)了解。
關(guān)注下方公眾號獲取更多小胖哥的原創(chuàng)編程干貨

往期推薦
