Properties与Yaml加载顺序
SpringBoot配置优先级和配置覆盖
bootstrap(.properties/.yml) 文件是SpringBoot的默认配置文件,它的加载时间相比较于application(.properties/.yml)更早
application(.properties/.yml)和bootstrap(.properties/.yml)都是SpringBoot的默认配置文件,不同的是定位不同
bootstrap是系统级别的参数配置,这些参数一般是不变动的
application是应用级别的参数配置
优先级
在
同一级目录下,会比较前缀bootstrap,application, 其中bootstrap比application的优先级高; 其次比较后缀.properties,.yml,其中.properties比.yml优先级高
bootstrap.properties > bootstrap.yml > application.properties > application.yml
配置覆盖
- 当同一个配置属性在
bootstrap.properties和bootstrap.yml文件中都存在时,properties中的配置会被加载,而忽略yml中的配置(即优先级高的配置覆盖优先级低的配置); 不同配置则互补. 此处application中.properties和.yml同理 - 当同一个配置属性在
bootstrap和application文件中都存在时,虽然优先级会加载bootstrap,但是会被application中的配置覆盖,此时则变成了低优先级覆盖高优先级的配置 - 当同一个配置属性在
bootstrap.properties,bootstrap.yml,application.properties,application.yml中都存在时,application.properties里的配置文件一定会覆盖其他配置文件;首先遵循第二点;虽然bootstrap会被优先加载,但是会被application中的配置覆盖;此时就剩下application.properties和application.yml配置文件,此时遵循第一点(即优先级高的配置覆盖优先级低的配置);所以application.properties的配置会覆盖掉其他配置文件
代码验证
验证结论一
- 先决条件
- 准备
bootstrap.properties和bootstrap.yml配置文件- 采用端口验证
1 | ### bootstrap.properties |
1 | ### bootstrap.yml |
1 | INFO 16724 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 7071 (http) with context path '' |
结论
启动端口为:
7071;配置文件前缀相同的情况下,优先级高的配置覆盖优先级低的配置
验证结论二
- 先决条件
- 准备
bootstrap.properties和application.properties配置文件- 采用端口验证
1 | ### bootstrap.properties |
1 | ### application.properties |
1 | INFO 17812 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9091 (http) with context path '' |
结论
启动端口为:
9091;不同前缀的properties配置文件中存在相同配置时,优先加载bootstrap但是会被application中的配置覆盖
验证结论三
- 先决条件
- 准备
bootstrap.properties,bootstrap.yml,application.properties,application.yml配置文件- 采用端口验证
1 | ### bootstrap.properties |
1 | ### bootstrap.yml |
1 | ### application.properties |
1 | ### application.yml |
1 | INFO 10652 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9091 (http) with context path '' |
结论
启动端口为:
9091;当同一个配置属性在四个配置文件中都存在,application.properties的配置一定会覆盖其他配置文件
附加
SpringBoot 的多环境配置
在
SpringBoot中,使用application.profiles.active属性来指定激活的环境当启动 Spring Boot 应用程序时,Spring Boot 会加载
application.yml文件,以及所有application-{profile}.yml命名的配置文件
在
application.profiles.active=prod的情况下; Spring Boot 会加载application.yml和application-prod.yml两个配置文件.这两个配置文件中的所有属性都会被加载,如果存在相同的属性,则
application-prod.yml中的属性会覆盖application.yml中的属性
SpringBoot多环境配置原理
- 首先加载
application.yml文件 - 然后加载所有以
application-{profile}.yml命名的配置文件,其中{profile}是激活的环境 - 最后,将所有配置文件中的属性合并成一个属性集合.如果存在相同的属性,则
{profile}中的属性会覆盖application.yml中的属性
因此,在
application.profiles.active=prod的情况下,application.yml和application-prod.yml两个配置都会被加载,如果存在相同的属性,则application-prod.yml中的属性会覆盖application.yml中的属性
举例说明
- 先决条件
- 准备
application.yml和application-prod.yml两个文件- 采用端口验证
1 | ### application.yml |
1 | ### application-prod.yml |
当
application.profiles.active=prod
结论
1 | // SpringBoot应用程序启动的端口号是9090 |