概述
spring-boot(以下简称boot)中,profile属性源优先级仅高于defaultProperties,相比其他属性源优先级都要低.
profile属性文件完整位置由以下概念组成:
fileLocation = location + name [+ "-" + activeProfile] + "." + extension
应用启动时,会枚举所有可能的fileLocation.可简单理解为以下代码:
for (activeProfile : activeProfiles) {
for (location : searchLocations) {
for (name : names) {
for (extension : extensions) {
load(location, name, activeProfile, extension);
}
}
}
}
当然,实际代码还是比较复杂的,感兴趣的同学可以查看org.springframework.boot.context.config.ConfigFileApplicationListener#postProcessEnvironment
关于location
location代表boot搜索profile属性文件的位置,默认情况下,boot会搜索以下位置:
-
file:./config/
:应用工作目录的config子目录 -
file:./config/*/
:应用工作目录下,config所有子目录 -
file:./
:应用的当前工作目录 -
classpath:/config/
:类路径下的config子目录 -
classpath:/
:类路径下
如果不像使用默认搜索位置,可通过spring.config.location
进行重新配置,
如果想在默认搜索位置基础上,增加额外的搜索位置,也可以通过spring.config.additional-location
进行新增.
多个位置之间,
分隔,且位置字符串支持以*
作为通配符.
多个位置的优先级按照从低到高排列,也就是先配置的profile优先级会最低.
注意:location可以是目录,也可以是文件.
如果以/
结尾,则boot认为其是目录,否则认为是文件.
如果location为文件,则boot直接进行定位和加载,不再使用name的概念.
如果location为目录,则boot会进一步获取name.
关于name
默认的name为application
,也可以通过spring.config.name
进行修改.
多个name之间,
分隔,且不支持*
作为通配符.
关于extension
boot支持不同的文件类型扩展名,不同类型的文件由不同的PropertySourceLoader
实现进行解析.
默认情况下:
-
PropertiesPropertySourceLoader
支持properties文件和xml文件 -
YamlPropertySourceLoader
支持yml文件和yaml文件
注意:读取单个属性文件时,可能会得到多个属性源,因为想yml格式这样的文件支持多文档.
网友评论