Spring Boot中配置⽂件的加载顺序是怎样的?

06-01 1982阅读

优先级从⾼到低,⾼优先级的配置覆盖低优先级的配置,所有配置会形成互补配置。

  1. 命令⾏参数。所有的配置都可以在命令⾏上进⾏指定;

  2. Java系统属性(System.getProperties());

  3. 操作系统环境变量 ;

  4. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置⽂件

  5. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置⽂件 再来加载不带profile

  6. jar包外部的application.properties或application.yml(不带spring.profile)配置⽂件

  7. jar包内部的application.properties或application.yml(不带spring.profile)配置⽂件

  8. @Configuration注解类上的@PropertySource

Spring Boot 支持多环境配置和外部化配置,其加载顺序遵循从高优先级到低优先级覆盖的原则。以下是完整的加载顺序及底层机制分析:


1. 配置文件的加载顺序(从高到低)

Spring Boot 配置文件按以下顺序加载,后加载的配置会覆盖先前的同名属性:

优先级配置来源示例适用场景
1 (最高)命令行参数--server.port=9090临时测试、动态覆盖
2SPRING_APPLICATION_JSON环境变量中的 JSON 字符串容器化部署(如 Docker/K8s)
3Java 系统属性 (-D)-Dspring.profiles.active=prodJVM 参数指定
4操作系统环境变量export SERVER_PORT=9090生产环境标准化配置
5当前目录的 /config/ 子目录./config/application.yml优先级高于 JAR 包内的配置
6当前目录的配置文件./application.yml本地开发灵活配置
7类路径下的 /config/ 目录classpath:/config/application.yml项目内共享配置
8 (最低)类路径下的配置文件classpath:/application.yml默认配置(如 starter 提供的配置)

注:同一优先级下,application.properties 和 application.yml 同时存在时,.properties 优先级高于 .yml。


2. 多环境配置的加载规则

Spring Boot 通过 spring.profiles.active 指定激活的环境,加载顺序如下:

  1. 先加载 application.{yml/properties}(主配置)。

  2. 再加载 application-{profile}.{yml/properties}(环境专属配置),覆盖主配置。

    Spring Boot中配置⽂件的加载顺序是怎样的?
    (图片来源网络,侵删)

示例:

# application.yml(公共配置)
server:
  port: 8080
---
# application-prod.yml(生产环境)
server:
  port: 9090
  ssl:
    enabled: true

若激活 prod 环境(spring.profiles.active=prod),最终 server.port=9090。

Spring Boot中配置⽂件的加载顺序是怎样的?
(图片来源网络,侵删)

3. 源码解析(关键类)

Spring Boot 通过 ConfigFileApplicationListener 和 PropertySourceLoader 实现配置加载:

(1)加载流程

  1. SpringApplication.run() 启动时,触发 EnvironmentPostProcessor。

    Spring Boot中配置⽂件的加载顺序是怎样的?
    (图片来源网络,侵删)
  2. ConfigFileApplicationListener 扫描所有配置路径:

  3. private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";
  4. PropertySourceLoader 解析文件(支持 .properties 和 .yml):

    • PropertiesPropertySourceLoader:处理 .properties 文件。

    • YamlPropertySourceLoader:处理 .yml 文件。

(2)优先级实现

通过 MutablePropertySources 维护属性源列表,后添加的源优先级更高:

public class MutablePropertySources implements PropertySources {
    private final List
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码