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 配置文件加载机制是一个很重要的考察点,在日常的配置扩展、多环境、运维部署都非常重要,也是面试经常问的知识点,需要学习了解。
关注下方公众号获取更多小胖哥的原创编程干货

往期推荐
