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<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.properties
和application.yaml
进行优先级加载时,它们都会加载,并不是application.properties
加载了application.yaml
就不加载了,而是它们的内容根据优先级的高低进行合并。
优先级合并
同样地当根据DEFAULT_SEARCH_LOCATIONS
路径进行优先级的时候它们也是同样的机制进行合并的。这一点我们一定要明白。
优先级指的是,配置文件都会加载,相同属性根据优先级高低进行合并。
4. 总结
Spring Boot 配置文件加载机制是一个很重要的考察点,在日常的配置扩展、多环境、运维部署都非常重要,也是面试经常问的知识点,需要学习了解。我是:码农小胖哥 关注我获取更多的原创编程干货。
- 数据迁移判断非空约束(r2笔记45天)
- 【专业技术】linux下socket编程
- oracle并行的小细节(r2笔记44天)
- python实现朴素贝叶斯模型:文本分类+垃圾邮件分类
- 使用闪回查询备份数据(r2笔记43天)
- 生产环境sql语句调优实战第四篇(r2笔记41天)
- 生产环境sql语句调优实战第五篇(r2笔记41天)
- python实现逻辑logistic回归:预测病马的死亡率
- 开发 | 图片数据集太少?看我七十二变,Keras Image Data Augmentation 各参数详解
- linux过滤空文件的命令总结(r2笔记40天)
- shell脚本自动化采集性能sql(r2笔记39天)
- R语言与点估计学习笔记(EM算法与Bootstrap法)
- 开发 | 为个人深度学习机器选择合适的配置
- 阿里音乐流行趋势预测竞赛数据清洗整合——纯python
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释