logo头像

From zero to HERO

Spring Boot 配置文件的加载优先级总结

1. 前言

今天突发奇想,如果Spring Boot的配置文件同时存在application.propertiesapplication.yaml,于是便测试了一波。结果测出来优先级的顺序为 properties>yaml。大部分情况下我们并不会这两种类型的配置混用,但是不免一些面试官会拿这个刁难你,所以要有个印象。但是Spring Boot配置文件位置的优先级还是经常用的,所以今天就总结一波。

本文基于Spring Boot 2.3.3.RELEASE

2. 配置文件加载顺序

Spring Boot中,配置文件监听器ConfigFileApplicationListener用来处理加载配置文件逻辑,关键的加载逻辑优先级是下面这段代码

private Set<String> getSearchLocations() {
    // CONFIG_ADDITIONAL_LOCATION_PROPERTY = "spring.config.additional-location"
   Set<String> 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/

./config/ 示意图

  • file:./config/*/

./config/*/ 示意图

  • file:./

./ 示意图

  • classpath:/config/

classpath:/config/ 示意图

  • classpath:/

classpath:/ 示意图

3. 误区

这里容易产生一个误区,文件之间的优先级是这样的。当application.propertiesapplication.yaml进行优先级加载时,它们都会加载,并不是application.properties加载了application.yaml就不加载了,而是它们的内容根据优先级的高低进行合并(merge)。

优先级合并

同样地当根据DEFAULT_SEARCH_LOCATIONS路径进行优先级的时候它们也是同样的机制进行合并的。这一点我们一定要明白。

优先级指的是,配置文件都会加载,相同属性根据优先级高低进行合并。

4. 总结

Spring Boot 配置文件加载机制是一个很重要的考察点,在日常的配置扩展、多环境、运维部署都非常重要,也是面试经常问的知识点,需要学习了解。我是:码农小胖哥 关注我获取更多的原创编程干货。

评论系统未开启,无法评论!