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 | │─SpringBootTest |
spring.profiles.active=dev代码在包SpringBootDemo-0.0.1-SNAPSHOT.jar中,其他地方没有。经过测试,发现配置文件的优先级如下所示**(数字越小优先级越高)**:
1 | │─SpringBootTest |
包外的dev配置读完,再读包外其他配置,最后读包内的配置。
另一个例子,项目包的部署后的目录结构如下:
1 | ├─SpringBootTest |
spring.profiles.active=dev代码在包SpringBootDemo-0.0.1-SNAPSHOT.jar中,其他地方没有。经过测试,发现配置文件的优先级如下所示**(数字越小优先级越高)**:
1 | ├─SpringBootTest |
包外的配置读完,再读包内的配置。
综上两个例子,可以知道,即使包内有激活profiles的代码会生效,但如果包外有配置会先读包外的配置,并不会优先读包内的dev配置。
4、yml和properties混用容易出问题,最好都用同一种格式。
5、现网都要有外置的配置文件,且需要激活profile,这样可以保证优先读取包外的配置。