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中简单的死锁示例引出四种排查死锁的工具,详细讲解请看全文,希望对大家有所帮助
    2021-08-08
  • java8 时间日期的使用与格式化示例代码详解

    java8 时间日期的使用与格式化示例代码详解

    这篇文章主要介绍了java8 时间日期的使用与格式化,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Java中 this和super的用法与区别小结

    Java中 this和super的用法与区别小结

    在Java的学习与开发者我们经常遇到this和super关键字,本文主要介绍了Java中 this和super的用法与区别小结,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • jdk自带定时器使用方法详解

    jdk自带定时器使用方法详解

    这篇文章主要为大家详细介绍了jdk自带定时器的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Spring中@DependsOn注解的使用代码实例

    Spring中@DependsOn注解的使用代码实例

    这篇文章主要介绍了Spring中@DependsOn注解的使用代码实例,Spring中@DependsOn,主要是使用在类和方法上, 作用是当前对象要依赖另外一些对象,被依赖的对象会先注册到Spring的IOC容器中,需要的朋友可以参考下
    2024-01-01
  • JAVA一个快速排序实现代码

    JAVA一个快速排序实现代码

    排序有哪几种方法?请列举。并用JAVA实现一个快速排序.,需要的朋友可以参考下
    2017-02-02
  • 教你在 IntelliJ IDEA 中使用 VIM插件的详细教程

    教你在 IntelliJ IDEA 中使用 VIM插件的详细教程

    这篇文章主要介绍了在 IntelliJ IDEA 中使用 VIM的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Java利用Apache POI实现Excel文件读写操作

    Java利用Apache POI实现Excel文件读写操作

    Apache POI是一个用于读写Microsoft Office文件格式的Java库,可以用来读取或写入Excel文件,下面小编就和大家详细讲讲Java借助Apache POI读写Excel的详细代码吧
    2026-02-02
  • SpringMVC中的@ControllerAdvice使用场景详解

    SpringMVC中的@ControllerAdvice使用场景详解

    这篇文章主要介绍了SpringMVC中的@ControllerAdvice使用场景详解,在Spring MVC进行调用的过程中,会有很多的特殊的需求,比如全局异常,分页信息和分页搜索条件,请求时带来返回时还得回显页面,需要的朋友可以参考下
    2024-01-01
  • 一文学透ApplicationContext继承接口功能及与BeanFactory区别

    一文学透ApplicationContext继承接口功能及与BeanFactory区别

    这篇文章主要为大家介绍了ApplicationContext继承接口功能及与BeanFactory区别示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04

最新评论