概述
spring-boot(以下簡稱boot)中,profile屬性源優(yōu)先級僅高于defaultProperties,相比其他屬性源優(yōu)先級都要低.
profile屬性文件完整位置由以下概念組成:
fileLocation = location + name [+ "-" + activeProfile] + "." + extension
應(yīng)用啟動時,會枚舉所有可能的fileLocation.可簡單理解為以下代碼:
for (activeProfile : activeProfiles) {
for (location : searchLocations) {
for (name : names) {
for (extension : extensions) {
load(location, name, activeProfile, extension);
}
}
}
}
當(dāng)然,實(shí)際代碼還是比較復(fù)雜的,感興趣的同學(xué)可以查看org.springframework.boot.context.config.ConfigFileApplicationListener#postProcessEnvironment
關(guān)于location
location代表boot搜索profile屬性文件的位置,默認(rèn)情況下,boot會搜索以下位置:
-
file:./config/
:應(yīng)用工作目錄的config子目錄 -
file:./config/*/
:應(yīng)用工作目錄下,config所有子目錄 -
file:./
:應(yīng)用的當(dāng)前工作目錄 -
classpath:/config/
:類路徑下的config子目錄 -
classpath:/
:類路徑下
如果不像使用默認(rèn)搜索位置,可通過spring.config.location
進(jìn)行重新配置,
如果想在默認(rèn)搜索位置基礎(chǔ)上,增加額外的搜索位置,也可以通過spring.config.additional-location
進(jìn)行新增.
多個位置之間,
分隔,且位置字符串支持以*
作為通配符.
多個位置的優(yōu)先級按照從低到高排列,也就是先配置的profile優(yōu)先級會最低.
注意:location可以是目錄,也可以是文件.
如果以/
結(jié)尾,則boot認(rèn)為其是目錄,否則認(rèn)為是文件.
如果location為文件,則boot直接進(jìn)行定位和加載,不再使用name的概念.
如果location為目錄,則boot會進(jìn)一步獲取name.
關(guān)于name
默認(rèn)的name為application
,也可以通過spring.config.name
進(jìn)行修改.
多個name之間,
分隔,且不支持*
作為通配符.
關(guān)于extension
boot支持不同的文件類型擴(kuò)展名,不同類型的文件由不同的PropertySourceLoader
實(shí)現(xiàn)進(jìn)行解析.
默認(rèn)情況下:
-
PropertiesPropertySourceLoader
支持properties文件和xml文件 -
YamlPropertySourceLoader
支持yml文件和yaml文件
注意:讀取單個屬性文件時,可能會得到多個屬性源,因?yàn)橄難ml格式這樣的文件支持多文檔.