Spring Boot的配置文件加载优先级

基于Spring Boot 2.x详细介绍了Spring Boot的配置文件的加载优先级。

文章目录

  • 1 总体优先级
  • 2 内部配置优先级
  • 3 bootstrap和application的优先级

1 总体优先级

Spring boot支持非常多的配置,常见的外部配置和内部配置的整体优先级(https://docs.spring.io/spring-boot/docs/2.3.10.RELEASE/reference/html/spring-boot-features.html#boot-features-external-config):

  1. 命令行参数,比如–server.port=8080。
  2. JVM系统属性,通过System.getProperties()方法获取。
  3. 系统环境属性,通过System.getenv()方法获取。
  4. jar包外部的application-{profile}.properties/yml配置文件,如果没有指明激活的profile,则默认为default。
  5. jar包内部的application-{profile}.properties/yml配置文件,如果没有指明激活的profile,则默认为default。
  6. jar包外部的application.properties/yml配置文件。
  7. jar包内部的application.properties/yml配置文件。
  8. 通过@Configuration注解类上的@PropertySource注解引入的配置文件。

2 内部配置优先级

配置文件查找时首先查找指定profile的,然后再查找没有profile的。查找的目录优先级(https://docs.spring.io/spring-boot/docs/2.3.10.RELEASE/reference/html/spring-boot-features.html#boot-features-external-config-application-property-files):

  1. 项目根目录下的/config目录下的配置文件。
  2. 项目根目录下的配置文件。
  3. 项目类路径(resources)下的/config目录下的配置文件。
  4. 项目类路径(resources)下的配置文件。

注意点:

  1. 同一目录下,.properties文件优先于.yml文件加载。
  2. 可以使用spring.config.location属性替换默认查找位置,也可以使用spring.config.additional-location属性来添加额外的配置位置,将会首先查找指定的位置然后查找默认位置。
  3. 需要注意的是,项目根目录下的配置文件或者/config目录下的配置文件在打包的时候不会被打入jar包中,因此一般很少用到。

3 bootstrap和application的优先级

bootstrap配置文件由spring父上下文加载,并且比application配置文件优先加载(父上下文不会使用application配置文件),而application配置文件由子上下文加载。bootstrap加载的配置信息不能被application的相同配置覆盖。

但是注意,如果要使用配置文件中的变量,那么同名变量将使用application文件中的配置,比如如果两个配置文件都有server.post变量,那么Spring将使用application中配置的值。为什么?因为在Environment中,application配置文件的propertySource排在bootstrap配置文件的propertySource之前,Spring 在进行属性注入、获取时,将会顺序遍历所有的propertySource查找属性,如果找到了就直接返回。.peoperties文件比.yaml文件的属性查找优先级更高的原理一样。

Spring Boot的配置文件加载优先级_第1张图片

相关文章:

  1. https://spring.io/
  2. Spring Framework 5.x 学习
  3. Spring MVC 5.x 学习
  4. Spring Framework 5.x 源码

如有需要交流,或者文章有误,请直接留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!

你可能感兴趣的:(Spring,Boot,2.x,spring,boot,spring,boot优先级,配置文件优先级)