开发Spring Boot项目的时候,配置参数是必要的,但是为了配合不同的运行环境与三方服务,我们就会创建多个配置文件。那么如何准确地在不同环境下拿到对应的配置就需要先了解配置的优先级。

本文测试环境为:JDK17Spring Boot 3.2.2
测试方式为:注入spring.application.name名称结果

配置入口

Spring Boot的配置入口有以下三个:

  • 启动参数
  • application.*
  • bootstrap.yml

Nacos等的配置中心作为独立的服务,并不算在本文讨论范围内。

application.*bootstrap.yml目录层级相同的情况下,配置优先级顺序为:启动参数 > application.* > bootstrap.yml

设计启动参数优先级最高的目的,是为了让开发者将项目打包后,仍可以在不修改文件的情况下完成参数修改,方便适配不同的运行环境。

配置优先级逻辑

配置的优先级其实是按照覆盖和补全逻辑走的,后加载的会覆盖补全已有配置,这表示加载顺序越靠后优先级越高

application.*配置优先级

Spring Boot项目application.*配置存放的地方有三个:

  1. 项目代码根目录
  2. resources目录下
  3. 打包jar文件同级目录

这里的配置优先级是越外层,优先级越高。这表示存放目录的优先级为:

jar包目录 > 项目目录 > resources目录

而在jar包目录项目目录下,Spring Boot也会优先读取config目录下的文件,这表示文件优先级从高到底依次为:

  1. jar包同级config目录
  2. jar包同级目录
  3. 项目内config目录
  4. 项目根目录
  5. resources目录

这里用图例简单说明一下,数字代表优先级(1最高),其中config下的application.yml的优先级最高并会覆盖其他三个配置参数。↓

简单说明

额外说明

对于application.ymlapplication.properties两个后缀的配置来说,properties的优先级会更高

应用场景

最常见的场景就是多人协作开发。多人协作的项目总会遇到运行环境不相同的情况,例如本地redis、数据库地址、运行端口号等等,此时肯定不能使用同一个配置文件,必然会有个人的配置文件(启动参数并不是很推荐,主要是不便于修改和查看)。

那么这个配置文件推荐存放在项目根目录,优点是不需要更改启动参数,并且其他人提交代码也不会影响当前的个人配置。↓

根目录下

参考资料

  1. huaihkiss · spring boot启动无法获取spring.application.name问题
  2. 恒宇少年 · 配置文件的加载顺序以及优先级覆盖

本站总访问量