Spring Boot中配置⽂件的加载顺序是怎样的?
优先级从⾼到低,⾼优先级的配置覆盖低优先级的配置,所有配置会形成互补配置。
-
命令⾏参数。所有的配置都可以在命令⾏上进⾏指定;
-
Java系统属性(System.getProperties());
-
操作系统环境变量 ;
-
jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置⽂件
-
jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置⽂件 再来加载不带profile
-
jar包外部的application.properties或application.yml(不带spring.profile)配置⽂件
-
jar包内部的application.properties或application.yml(不带spring.profile)配置⽂件
-
@Configuration注解类上的@PropertySource
Spring Boot 支持多环境配置和外部化配置,其加载顺序遵循从高优先级到低优先级覆盖的原则。以下是完整的加载顺序及底层机制分析:
1. 配置文件的加载顺序(从高到低)
Spring Boot 配置文件按以下顺序加载,后加载的配置会覆盖先前的同名属性:
优先级 | 配置来源 | 示例 | 适用场景 |
---|---|---|---|
1 (最高) | 命令行参数 | --server.port=9090 | 临时测试、动态覆盖 |
2 | SPRING_APPLICATION_JSON | 环境变量中的 JSON 字符串 | 容器化部署(如 Docker/K8s) |
3 | Java 系统属性 (-D) | -Dspring.profiles.active=prod | JVM 参数指定 |
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 指定激活的环境,加载顺序如下:
-
先加载 application.{yml/properties}(主配置)。
-
再加载 application-{profile}.{yml/properties}(环境专属配置),覆盖主配置。
(图片来源网络,侵删)
示例:
# application.yml(公共配置) server: port: 8080 --- # application-prod.yml(生产环境) server: port: 9090 ssl: enabled: true
若激活 prod 环境(spring.profiles.active=prod),最终 server.port=9090。
3. 源码解析(关键类)
Spring Boot 通过 ConfigFileApplicationListener 和 PropertySourceLoader 实现配置加载:
(1)加载流程
-
SpringApplication.run() 启动时,触发 EnvironmentPostProcessor。
(图片来源网络,侵删) -
ConfigFileApplicationListener 扫描所有配置路径:
-
private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";
-
PropertySourceLoader 解析文件(支持 .properties 和 .yml):
-
PropertiesPropertySourceLoader:处理 .properties 文件。
-
YamlPropertySourceLoader:处理 .yml 文件。
-
(2)优先级实现
通过 MutablePropertySources 维护属性源列表,后添加的源优先级更高:
public class MutablePropertySources implements PropertySources { private final List