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

 更新时间:2025年07月21日 09:47:34   作者:坏猫警长  
SpringBoot配置优先级按来源排序,15种类型中命令行参数最高,配置文件次之,classpath下config目录的配置优先级高于jar内文件,配置中心如Nacos的配置则插入列表前端,所有配置最终存入Environment的propertySources,通过顺序遍历实现覆盖

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包中的配置。

总结

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

相关文章

  • Java 项目中使用递归的小结

    Java 项目中使用递归的小结

    在 Java 中,递归是指在方法的定义中调用自身的过程,递归是基于方法调用栈的原理实现的:当一个方法被调用时,会在调用栈中创建一个对应的栈帧,包含方法的参数、局部变量和返回地址等信息,这篇文章主要介绍了Java 项目中对使用递归的理解分享,需要的朋友可以参考下
    2024-07-07
  • 使用@RequestBody 接收复杂实体类集合

    使用@RequestBody 接收复杂实体类集合

    这篇文章主要介绍了使用@RequestBody 接收复杂实体类集合方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Spring注解之@Import注解的使用和源码分析

    Spring注解之@Import注解的使用和源码分析

    今天主要介绍Spring @Import注解,在Spring中@Import使用得比较频繁,它得作用是导入bean,具体的导入方式有多种,特别在SpringBoot项目中,很多地方都使用到了@Import注解,感兴趣的小伙伴可以参考阅读
    2023-04-04
  • Java二维数组与稀疏数组相互转换实现详解

    Java二维数组与稀疏数组相互转换实现详解

    在某些应用场景中需要大量的二维数组来进行数据存储,但是二维数组中却有着大量的无用的位置占据着内存空间,稀疏数组就是为了优化二维数组,节省内存空间
    2022-09-09
  • springboot 多环境配置 yml文件版的实现方法

    springboot 多环境配置 yml文件版的实现方法

    这篇文章主要介绍了springboot 多环境配置 yml文件版的实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • Java日常练习题,每天进步一点点(63)

    Java日常练习题,每天进步一点点(63)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-08-08
  • Java中的RPC框架Dubbo原理和机制详解

    Java中的RPC框架Dubbo原理和机制详解

    这篇文章主要介绍了Java中的RPC框架Dubbo原理和机制详解,Dubbo 是一款Java RPC框架,致力于提供高性能的 RPC 远程服务调用方案,作为主流的微服务框架之一,Dubbo 为开发人员带来了非常多的便利,需要的朋友可以参考下
    2024-01-01
  • 使用okhttp替换Feign默认Client的操作

    使用okhttp替换Feign默认Client的操作

    这篇文章主要介绍了使用okhttp替换Feign默认Client的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Springboot hibernate-validator 6.x快速校验示例代码

    Springboot hibernate-validator 6.x快速校验示例代码

    这篇文章主要介绍了Springboot hibernate-validator 6.x校验,本文以6.2.1.Final版本为例解决了log4j版本的漏洞问题,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-12-12
  • 详解Java中字符串缓冲区StringBuffer类的使用

    详解Java中字符串缓冲区StringBuffer类的使用

    StringBuffer与String类似,只不过StringBuffer在进行字符串处理时不生成新的对象,下面我们就来详解Java中字符串缓冲区StringBuffer类的使用:
    2016-06-06

最新评论