Spring Boot配置文件顺序学习

1、SpringBoot的总体读取顺序优先级包外大于包内,properties大于yml
2、 SpringBoot的总体读取顺序如下所示:

  • config/application.properties(项目同级目录中config目录下)
  • config/application.yml
  • application.properties(项目同级目录下)
  • application.yml
  • resources/config/application.properties(项目resources目录中config目录下)
  • resources/config/application.yml
  • resources/application.properties(项目的resources目录下)
  • resources/application.yml

项目同级目录,相当于生产环境中的JAR包。

3、配置文件中只要有spring.profiles.active=dev代码程序就会激活。
如果该代码在包内,程序会优先读取包外的配置(包外的conf/application-dev.properties->conf/application-dev.yml->application-dev.properties->application-dev.yml)再读取包内的配置。如果配置在包外,很容易理解,就不赘述了。
举个例子,项目包的部署后的目录结构如下:

1
2
3
4
5
6
7
│─SpringBootTest
│ │ application-dev.properties
│ │ application.properties
│ │ SpringBootDemo-0.0.1-SNAPSHOT.jar
│ └──config
│ application-dev.properties
│ application.yml

spring.profiles.active=dev代码在包SpringBootDemo-0.0.1-SNAPSHOT.jar中,其他地方没有。经过测试,发现配置文件的优先级如下所示**(数字越小优先级越高)**:

1
2
3
4
5
6
7
│─SpringBootTest
│ │ application-dev.properties (2)
│ │ application.properties (4)
│ │ SpringBootDemo-0.0.1-SNAPSHOT.jar (5)
│ └──config
│ application-dev.properties (1)
│ application.yml (3)

包外的dev配置读完,再读包外其他配置,最后读包内的配置。

另一个例子,项目包的部署后的目录结构如下:

1
2
3
4
5
├─SpringBootTest
│ │ application.properties
│ │ SpringBootDemo-0.0.1-SNAPSHOT.jar
│ └──config
│ application.yml

spring.profiles.active=dev代码在包SpringBootDemo-0.0.1-SNAPSHOT.jar中,其他地方没有。经过测试,发现配置文件的优先级如下所示**(数字越小优先级越高)**:

1
2
3
4
5
├─SpringBootTest
│ │ application.properties (2)
│ │ SpringBootDemo-0.0.1-SNAPSHOT.jar (3)
│ └──config
│ application.yml (1)

包外的配置读完,再读包内的配置。
综上两个例子,可以知道,即使包内有激活profiles的代码会生效,但如果包外有配置会先读包外的配置,并不会优先读包内的dev配置

4、yml和properties混用容易出问题,最好都用同一种格式。
5、现网都要有外置的配置文件,且需要激活profile,这样可以保证优先读取包外的配置。