Spring Boot的配置文件加载优先级
Posted 刘Java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot的配置文件加载优先级相关的知识,希望对你有一定的参考价值。
基于Spring Boot 2.x详细介绍了Spring Boot的配置文件的加载优先级。
1 总体优先级
Spring boot支持非常多的配置,常见的外部配置和内部配置的整体优先级(https://docs.spring.io/spring-boot/docs/2.3.10.RELEASE/reference/html/spring-boot-features.html#boot-features-external-config):
- 命令行参数,比如–server.port=8080。
- JVM系统属性,通过System.getProperties()方法获取。
- 系统环境属性,通过System.getenv()方法获取。
- jar包外部的application-{profile}.properties/yml配置文件,如果没有指明激活的profile,则默认为default。
- jar包内部的application-{profile}.properties/yml配置文件,如果没有指明激活的profile,则默认为default。
- jar包外部的application.properties/yml配置文件。
- jar包内部的application.properties/yml配置文件。
- 通过@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):
- 项目根目录下的/config目录下的配置文件。
- 项目根目录下的配置文件。
- 项目类路径(resources)下的/config目录下的配置文件。
- 项目类路径(resources)下的配置文件。
注意点:
- 同一目录下,
.properties
文件优先于.yml
文件加载。 - 可以使用
spring.config.location
属性替换默认查找位置,也可以使用spring.config.additional-location
属性来添加额外的配置位置,将会首先查找指定的位置然后查找默认位置。 - 需要注意的是,项目根目录下的配置文件或者/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文件的属性查找优先级更高的原理一样。
相关文章:
如有需要交流,或者文章有误,请直接留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!
以上是关于Spring Boot的配置文件加载优先级的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot - ConfigDataEnvironmentPostProcessor(Boot 2.4)搞定配置文件加载优先级