Springboot配置方式和优先级
- 调试思路
- key的获取过程
- application.properties优先级
- 总结
在阅读开源项目时看到一种不太常见的属性配置方式,
在项目根路径定义配置文件。并且提到下面的顺序,验证并看一下源码实现。
# spring boot支持外部application.yml 读取优先级为:
# 1、file:./config/(当前目录下的config文件夹)
# 2、file:./(当前目录)
# 3、classpath:/config/(classpath下的config目录)
# 4、classpath:/(classpath根目录)
调试思路
先以默认方式定义属性并获取该属性,然后看一下获取配置的关键代码。最后依次在不同文件层级添加配置文件,通过属性是否被覆盖验证优先级。
/resources/application.properties配置文件:
spring.application.name=demo-springbootconfig
custom.name=/resources/application.properties #定义属性
测试类
@SpringBootApplication
public class DemoSpringbootconfigApplication {public static void main(String[] args) {ConfigurableApplicationContext ctx = SpringApplication.run(DemoSpringbootconfigApplication.class, args);// 获取自定义属性String name = ctx.getEnvironment().getProperty("custom.name");System.out.println("custom.name : " + name);}}
key的获取过程
通过
getProperty("custom.name")进入源码,可以看到如下方法:
ConfigurationProperty findConfigurationProperty(ConfigurationPropertyName name) {if (name == null) {return null;}for (ConfigurationPropertySource configurationPropertySource : getSource()) {ConfigurationProperty configurationProperty = configurationPropertySource.getConfigurationProperty(name);if (configurationProperty != null) {// 顺序遍历,存在则返回。所以getSource()中的元素顺序就是优先级return configurationProperty;}}return null;
}

根据调试截图可以看到,默认情况下,在resources目录中创建application.properties,在获取key时会依次从source集合中遍历。依次从系统属性、系统环境、配置文件中尝试获取。
application.properties优先级
在默认配置的基础上,依次在下列目录中添加
application.properties文件,文件中仅定义同名的key,结果如下:
- 添加
/resources/config/application.properties,覆盖/resources/application.properties中的cutom.name- 添加
./application.properties,覆盖/resources/config/application.properties中的cutom.name- 添加
./config/application.properties,覆盖./application.properties中的cutom.name
看一下获取key的过程:由于遍历时获取到key则返回,所以集合中元素的顺序即是多个application.properties配置文件的优先级,后四个元素刚好对应四个不同位置的配置文件。

这里集合元素的顺序决定了多个
application.properties的优先级,那么Springboot在加载多个配置文件时,肯定是优先从根目录的config文件夹读取并放入集合,其次从根目录读取,在然后从/resource/config/中读取,依次类推。
总结
- Springboot的
配置来源包括 :
- 命令行参数,优先级最高,例如:
java -jar yourapp.jar --server.port=9090 --spring.profiles.active=prod- Java系统属性
java -Dserver.port=9090 -Dspring.application.name=myapp -jar yourapp.jar- 环境变量
例如环境变量SERVER_PORT=8081会映射到server.port属性- 外部配置文件
java -jar yourapp.jar --spring.config.location=file:/path/to/your/application.yml- 配置文件
application.properties /application.yml
配置优先级通过调试源码可以看出,依次降低
- 多个application配置文件时,同样存在优先级:
./config/application.yml > ./application.yml > classpath:config/aplication.yml > classpath:application.yml