开发Spring Boot项目的时候,配置参数是必要的,但是为了配合不同的运行环境与三方服务,我们就会创建多个配置文件。那么如何准确地在不同环境下拿到对应的配置就需要先了解配置的优先级。
本文测试环境为:JDK17
、Spring Boot 3.2.2
测试方式为:注入spring.application.name
名称结果
配置入口
Spring Boot的配置入口有以下三个:
- 启动参数
- application.*
- bootstrap.yml
Nacos
等的配置中心作为独立的服务,并不算在本文讨论范围内。
当application.*
与bootstrap.yml
目录层级相同的情况下,配置优先级顺序为:启动参数
> application.*
> bootstrap.yml
。
设计启动参数
优先级最高的目的,是为了让开发者将项目打包后,仍可以在不修改文件的情况下完成参数修改,方便适配不同的运行环境。
配置优先级逻辑
配置的优先级其实是按照覆盖和补全逻辑走的,后加载的会覆盖补全已有配置,这表示加载顺序越靠后优先级越高。
application.*配置优先级
Spring Boot项目application.*
配置存放的地方有三个:
- 项目代码根目录下
- resources目录下
- 打包jar文件同级目录下
这里的配置优先级是越外层,优先级越高。这表示存放目录的优先级为:
而在jar包目录
与项目目录
下,Spring Boot也会优先读取config
目录下的文件,这表示文件优先级从高到底依次为:
- jar包同级config目录
- jar包同级目录
- 项目内config目录
- 项目根目录
- resources目录
这里用图例简单说明一下,数字代表优先级(1最高),其中config
下的application.yml
的优先级最高并会覆盖其他三个配置参数。↓
额外说明
对于application.yml
与application.properties
两个后缀的配置来说,properties
的优先级会更高
应用场景
最常见的场景就是多人协作开发。多人协作的项目总会遇到运行环境不相同的情况,例如本地redis、数据库地址、运行端口号等等,此时肯定不能使用同一个配置文件,必然会有个人的配置文件(启动参数并不是很推荐,主要是不便于修改和查看)。
那么这个配置文件推荐存放在项目根目录
,优点是不需要更改启动参数,并且其他人提交代码也不会影响当前的个人配置。↓