SpringBoot配置文件优先级用法及解读
SpringBoot配置文件优先级
SpringBoot官方文档对配置文件优先级有以下介绍,一共15种配置,从15到1为优先级由高到低排列。
其中较为常用的如:11.命令行参数>5.系统环境变量>3.配置文件

其中3.配置文件按类型优先级由高到低又依次是:
jar包外部指定的配置如外部的application-prod.properties/yaml
- >jar包外部普通配置文件如外部的application.properties/yaml
- >内部指定配置文件 > 内部普通配置文件

我们实际项目中经常用高优先级的配置来覆盖低优先级的配置,可以达到区分开发、测试、生产环境的效果:

其实以上的优先级介绍并没有覆盖所有的配置文件类型和配置形式,譬如我们还可以在classpath的config目录中放一个application.yaml,这个文件的优先级应该在哪个位置呢?
如果我们使用了如nacos这种配置中心,配置中心里的配置又应该在以上优先级的哪个位置呢?
我们可以从源码的角度来简单了解一下
SpringBoot对配置文件的优先级控制。
我们项目中的各种配置在SpringBoot启动时会被以各种方式读取加载,虽然来源不同,但是所有的配置最终都会被保存在Environment对象的propertySources属性中,如下图:

来自各个地方的配置,最终都存在了这个List中,所以我们会得到一个有序的配置文件列表,其中每一个元素对应一个配置文件。
这里注意一点,所谓的高优先级覆盖低优先级这种说法是有歧义的,低优先级的配置并不是被覆盖了,而是也会原样保存在这个List当中,但是其位置会相对靠后。

然后我们很自然的就会想到,项目里获取配置数据应该有个通用的逻辑才对,就是顺序遍历这个List中的元素,按key查找,找到了就返回,找不到再继续到下一个配置文件里找。
也就是如下代码:

如果要向这个配置列表里加入配置也并不麻烦,可以参考如下代码:
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(SB.class, args);
ConfigurableEnvironment environment = applicationContext.getEnvironment();
MutablePropertySources propertySources = environment.getPropertySources();
Map<String, Object> lastMap = new HashMap<>();
lastMap.put("testLast", "last");
propertySources.addLast(new MapPropertySource("lastMap", lastMap));
String last = environment.getProperty("testLast");
log.info("启动成功!");
}所以其实一共有几种类型的配置文件并不确定,我们可以自行增加,如果项目使用了配置中心,可以查看到其配置数据在List中的位置相对靠前,也就是为什么我们配置中心里的配置优先级高于jar包中的配置。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
ImportBeanDefinitionRegistrar手动控制BeanDefinition创建注册详解
这篇文章主要为大家介绍了ImportBeanDefinitionRegistrar手动控制BeanDefinition创建注册详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-12-12
Mybatis框架之工厂模式(Factory Pattern)
MyBatis中使用工厂模式来管理和创建SqlSession对象,从而简化数据库访问的配置和管理过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2024-11-11
Spring配置shiro时自定义Realm中属性无法使用注解注入的解决办法
今天小编就为大家分享一篇关于Spring配置shiro时自定义Realm中属性无法使用注解注入的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2019-03-03
解决springboot 实体类String转Date类型的坑
这篇文章主要介绍了解决springboot 实体类String转Date类型的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-10-10


最新评论