Properties与Yaml加载顺序

igxiaoshan Lv5

SpringBoot配置优先级和配置覆盖

bootstrap(.properties/.yml) 文件是SpringBoot默认配置文件,它的加载时间相比较于application(.properties/.yml)更早

application(.properties/.yml)和bootstrap(.properties/.yml)都是SpringBoot的默认配置文件,不同的是定位不同

bootstrap系统级别的参数配置,这些参数一般是不变动的

application应用级别的参数配置

优先级

同一级目录下,会比较前缀 bootstrap,application, 其中bootstrapapplication的优先级高; 其次比较后缀.properties,.yml,其中.properties.yml优先级高

bootstrap.properties > bootstrap.yml > application.properties > application.yml

配置覆盖

  • 当同一个配置属性在bootstrap.propertiesbootstrap.yml文件中都存在时,properties中的配置会被加载,而忽略yml中的配置(即优先级高的配置覆盖优先级低的配置); 不同配置则互补. 此处application.properties.yml同理
  • 当同一个配置属性在bootstrapapplication文件中都存在时,虽然优先级会加载bootstrap,但是会被application中的配置覆盖,此时则变成了低优先级覆盖高优先级的配置
  • 当同一个配置属性在bootstrap.properties,bootstrap.yml,application.properties,application.yml中都存在时,application.properties里的配置文件一定会覆盖其他配置文件;首先遵循第二点;虽然bootstrap会被优先加载,但是会被application中的配置覆盖;此时就剩下application.propertiesapplication.yml配置文件,此时遵循第一点(即优先级高的配置覆盖优先级低的配置);所以application.properties的配置会覆盖掉其他配置文件

代码验证

验证结论一

  • 先决条件
    • 准备bootstrap.propertiesbootstrap.yml配置文件
    • 采用端口验证
1
2
### bootstrap.properties
server.port=7071
1
2
3
### bootstrap.yml
server:
port: 7070
1
INFO 16724 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 7071 (http) with context path ''

结论

启动端口为:7071;配置文件前缀相同的情况下,优先级高的配置覆盖优先级低的配置

验证结论二

  • 先决条件
    • 准备bootstrap.propertiesapplication.properties配置文件
    • 采用端口验证
1
2
### bootstrap.properties
server.port=7071
1
2
### application.properties
server.port=9091
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
2
### bootstrap.properties
server.port=7071
1
2
3
### bootstrap.yml
server:
port: 7070
1
2
### application.properties
server.port=9091
1
2
3
### application.yml
server:
port: 9090
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.ymlapplication-prod.yml两个配置文件.

这两个配置文件中的所有属性都会被加载,如果存在相同的属性,则application-prod.yml中的属性会覆盖application.yml中的属性

SpringBoot多环境配置原理

  • 首先加载application.yml文件
  • 然后加载所有以application-{profile}.yml命名的配置文件,其中{profile}是激活的环境
  • 最后,将所有配置文件中的属性合并成一个属性集合.如果存在相同的属性,则{profile}中的属性会覆盖application.yml中的属性

因此,在application.profiles.active=prod的情况下,application.ymlapplication-prod.yml两个配置都会被加载,如果存在相同的属性,则application-prod.yml中的属性会覆盖application.yml中的属性

举例说明

  • 先决条件
    • 准备application.ymlapplication-prod.yml两个文件
    • 采用端口验证
1
2
3
### application.yml
server:
port: 8080
1
2
3
### application-prod.yml
server:
port: 9090

application.profiles.active=prod

结论

1
2
// SpringBoot应用程序启动的端口号是9090
INFO 10652 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9090 (http) with context path ''