Spring Boot 配置文件的加载优先级
1. 前言
今天突发奇想,如果Spring Boot的配置文件同时存在application.properties
和application.yaml
,于是便测试了一波。结果测出来优先级的顺序为 properties>yaml
。大部分情况下我们并不会这两种类型的配置混用,但是不免一些面试官会拿这个刁难你,所以要有个印象。但是Spring Boot配置文件位置的优先级还是经常用的,所以今天就总结一波。
本文基于Spring Boot 2.3.3.RELEASE
2. 配置文件加载顺序
在Spring Boot中,配置文件监听器ConfigFileApplicationListener
用来处理加载配置文件逻辑,关键的加载逻辑优先级是下面这段代码
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
(通常我们会通过命令行指定这个参数),就会从这个指定路径加载配置文件;如果没有指定spring.config.location
那么就会从下面路径从上到下进行优先加载:
file:./config/
file:./config/*/
file:./
classpath:/config/
classpath:/
3. 误区
这里容易产生一个误区,文件之间的优先级是这样的。当application.properties
和application.yaml
进行优先级加载时,它们都会加载,并不是application.properties
加载了application.yaml
就不加载了,而是它们的内容根据优先级的高低进行合并。
同样地当根据DEFAULT_SEARCH_LOCATIONS
路径进行优先级的时候它们也是同样的机制进行合并的。这一点我们一定要明白。
优先级指的是,配置文件都会加载,相同属性根据优先级高低进行合并。
4. 总结
Spring Boot 配置文件加载机制是一个很重要的考察点,在日常的配置扩展、多环境、运维部署都非常重要,也是面试经常问的知识点,需要学习了解。
关注下方公众号获取更多小胖哥的原创编程干货
往期推荐