java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot配置文件优先级

SpringBoot配置文件优先级用法及解读

作者:坏猫警长

SpringBoot配置优先级按来源排序,15种类型中命令行参数最高,配置文件次之,classpath下config目录的配置优先级高于jar内文件,配置中心如Nacos的配置则插入列表前端,所有配置最终存入Environment的propertySources,通过顺序遍历实现覆盖

SpringBoot配置文件优先级

SpringBoot官方文档对配置文件优先级有以下介绍,一共15种配置,从15到1为优先级由高到低排列。

其中较为常用的如:11.命令行参数>5.系统环境变量>3.配置文件

其中3.配置文件按类型优先级由高到低又依次是:

jar包外部指定的配置如外部的application-prod.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包中的配置。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文