一、SpringBoot 配置文件加载优先级
Spring Boot uses a very particular PropertySource
order that is designed to allow sensible overriding of values. Properties are considered in the following order
1 | 1. 开发者工具 Devtools 全局配置参数; |
这里我们只对比常用的几个地方的配置优先级:
命令行参数 > JAR包外面的 application-{profile}.properties
> JAR包内的 application-{profile}.properties
> JAR包外的 application.properties
> JAR包内的 application.properties
这样可能不太直观,而且有的项目会将 application.properties 文件放在config文件夹内,于是进一步对比了这两个位置的优先级,结果如下
SpringBoot
应用程序在启动时会遵循以下顺序进行加载配置文件
- 类路径下的配置文件
- 类路径内
config
子目录的配置文件 - 项目根目录下的配置文件
- 项目根目录下
config
子目录的配置文件
1 | . project-sample |
启动时加载配置文件顺序:1 -> 2 -> 3 -> 4
,优先级 4 > 3 > 2 > 1
注意:
- 如果在
IDEA
中是多module
项目,3 和 4 的位置是指的是项目根目录下的位置 - 当 .properties 和 .yml 文件同时存在时,.properties会失效,.yml会起作用。
二、bootstrap.yml配置文件
在 SpringCloud
的项目中,我们常常会碰到另外一个配置文件 bootstrap.yml
。这个配置文件主要是用于应用程序上下文的引导阶段,该配置文件的加载是在 application.yml
之前。
bootstrap.yml 和 application.yml 文件的区别可参考:What is the difference between putting a property on application.yml or bootstrap.yml in spring boot
在 SpringCloud 中有两种上下文,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文。官方的原话是 A Spring Cloud application operates by creating a “bootstrap” context, which is a parent context for the main application。
bootstrap.yml
配置文件的使用场景:
- 使用配置中心时,这时需要在bootstrap配置文件中添加连接到配置中心的信息,来加载外部配置中心的配置信息
- 一些固定的不能被覆盖的属性
- 一些加密/解密的信息
项目中 bootstrap.yml
示例:
1 | spring: |
引入配置中心Nacos
首先我们需要明确的是在没有Nacos之前,Spring Boot加载配置文件的顺序是怎样的。
在没有 Nacos 之前,项目启动时,第一个加载的是 bootstrap.yml,其次是加载 application.yml。如果在 application.yml 中设置了 profile 属性,那么最后加载的就是对应激活的文件,如 application-dev.yml 或者 application-prod.yml。
无论如何,在 Spring 家族中 bootstrap.yml 拥有最高的优先级。
无Nacos情境下 Spring Boot 的启动过程:
1 | 启动-->读取bootstrap.yml配置文件(本地没有就加载默认的)-->读取项目本地配置文件application.yml-->创建Spring容器-->加载Bean |
引入Nacos之后,上面的顺序会发生少许变化。
在加载bootstrap.yml完之后,Spring不再是去读取本地的application.yml配置文件,而是去读取Nacos的配置文件,之后才是本地的application.yml配置文件。
有Nacos情境下 Spring Boot 的启动过程:
1 | 启动-->读取bootstrap.yml配置文件(本地没有就加载默认的)-->读取Nacos的配置文件-->读取项目本地配置文件application.yml-->创建Spring容器-->加载Bean |
可以通过在远程配置中心中做如下配置,设置本地配置覆盖远程配置:
1 | spring: |