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

公众号程序猿DD

共 1901字,需浏览 4分钟

 ·

2020-09-10 17:45

1. 前言

今天突发奇想,如果Spring Boot的配置文件同时存在application.propertiesapplication.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/
./config/ 示意图
  • file:./config/*/
./config/*/ 示意图
  • file:./
./ 示意图
  • classpath:/config/
classpath:/config/ 示意图
  • classpath:/
classpath:/ 示意图

3. 误区

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

优先级合并

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

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

4. 总结

Spring Boot 配置文件加载机制是一个很重要的考察点,在日常的配置扩展、多环境、运维部署都非常重要,也是面试经常问的知识点,需要学习了解。

关注下方公众号获取更多小胖哥的原创编程干货


往期推荐

程序员接私活完整攻略+赠开源管理系统

记一次由Redis分布式锁造成的重大事故,避免以后踩坑!

三种 MySQL 大表优化方案

通过这个故事理解啥是 NIO

重磅!GitHub 推出容器镜像仓库服务!

Upwork 发布最赚钱的编程语言 Top 15


浏览 24
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报