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包中的配置。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。