SpringBoot配置文件加载顺序与参数优先级详解
场景背景
在现代微服务架构中,配置管理是确保应用在不同环境中正确运行的关键环节。Spring Boot提供了强大而灵活的配置机制,但复杂的配置源和优先级规则常常让开发者困惑。本文通过实际运行和日志分析,深入解析Spring Boot配置加载机制,帮助开发者掌握配置文件加载顺序和参数优先级。
⚠️ 本文基于 Spring Boot 2.7.0(ConfigFileApplicationListener 模型)进行实验验证。
Spring Boot 2.4+ 起引入 ConfigData 机制,虽然总体原则一致,但内部加载流程有所不同。
本次实验代码如下:demo-sprintboot.zip
术语说明
在开始之前,我们先明确两个核心概念:
- 配置控制参数:用于控制配置加载行为的参数,如
--spring.profiles.active
、--spring.config.location
- 属性值参数:用于直接提供属性值的参数,如
--app.description="命令行参数"
、-Dapp.description="JVM系统属性"
配置加载机制概述
Spring Boot配置处理分为两个阶段:
配置加载阶段
在配置加载阶段,Spring Boot根据命令行参数确定需要加载哪些配置文件。
例如:当使用命令行参数--spring.profiles.active=prod
时,Spring Boot会在配置加载阶段确定需要加载application-prod.yml
配置文件。
属性解析阶段
在属性解析阶段,Spring Boot按照优先级顺序解析每个属性的最终值。
例如:当同时存在命令行参数--app.description="命令行参数"
和配置文件中的app.description: "配置文件值"
时,Spring Boot会在属性解析阶段选择命令行参数的值作为最终值。
一、外部配置属性源优先级顺序
Spring Boot使用一个特定的PropertySource顺序,旨在允许合理地覆盖值。属性按以下顺序考虑(优先级从低到高):
- 默认属性(通过SpringApplication.setDefaultProperties指定)
- @PropertySource注解在@Configuration类上定义的属性
- 配置数据文件(如application.properties等)
- RandomValuePropertySource,只包含random.*属性
- 操作系统环境变量
- Java系统属性(System.getProperties())
- 来自java:comp/env的JNDI属性
- ServletContext初始化参数
- ServletConfig初始化参数
- SPRING_APPLICATION_JSON中的属性(环境变量或系统属性中内嵌的JSON)
- 命令行参数
- 测试属性(@SpringBootTest#properties属性等)
二、配置文件加载顺序与优先级
在配置文件加载方面,Spring Boot遵循特定的搜索顺序和优先级规则。
配置文件搜索位置
Spring Boot按以下顺序搜索配置文件(从高优先级到低优先级):
- 当前目录下的/config子目录(外部配置)
- 当前目录(外部配置)
- classpath下的/config包(内部配置)
- classpath根目录(内部配置)
这意味着外部配置文件(位于jar包外部)优先级高于内部配置文件(位于jar包内部)。
同一目录下不同格式配置文件的处理
在同一目录下,Spring Boot会加载所有格式的配置文件(.properties、.yml、.yaml),但它们的优先级如下:
- .properties(最高优先级)
- .yml
- .yaml(最低优先级)
这表示如果同一目录下同时存在application.properties、application.yml、application.yaml文件,它们都会被加载,但同名属性在application.properties中的值会覆盖其他文件中的值。
关键点
- 由
--spring.profiles.active
等参数控制加载内容 - 外部配置文件优先级高于jar包内配置文件
- 同一目录下config目录优先于根目录
- 同一目录下不同格式配置文件优先级:
.properties > .yml > .yaml
实验一:验证默认加载顺序
java -Dfile.encoding=UTF-8 -jar demo-1.0-SAPSHOT.jar
输出结果:
==============================================
Spring Boot配置文件加载顺序与优先级演示
==============================================
配置属性源列表(按加载顺序显示):
1. Config resource 'class path resource [application.yaml]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.yaml"
2. Config resource 'class path resource [application.yml]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.yml"
3. Config resource 'class path resource [application.properties]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.properties"
4. Config resource 'class path resource [config/application.yaml]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.yaml"
5. Config resource 'class path resource [config/application.yml]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.yml"
6. Config resource 'class path resource [config/application.properties]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.properties"
7. Config resource 'file [application.yaml]' via location 'optional:file:./' => app.description: "外部根目录application.yaml"
8. Config resource 'file [application.yml]' via location 'optional:file:./' => app.description: "外部根目录application.yml"
9. Config resource 'file [application.properties]' via location 'optional:file:./' => app.description: "外部根目录application.properties"
10. Config resource 'file [config\application.yaml]' via location 'optional:file:./config/' => app.description: "外部config目录application.yaml"
11. Config resource 'file [config\application.yml]' via location 'optional:file:./config/' => app.description: "外部config目录application.yml"
12. Config resource 'file [config\application.properties]' via location 'optional:file:./config/' => app.description: "外部config目录application.properties"
13. random => app.description: null
14. systemEnvironment => app.description: null
15. systemProperties => app.description: null
16. servletContextInitParams => app.description: null
17. servletConfigInitParams => app.description: null
==============================================
配置属性源列表(按优先级从高到低):
1. servletConfigInitParams => app.description: null
2. servletContextInitParams => app.description: null
3. systemProperties => app.description: null
4. systemEnvironment => app.description: null
5. random => app.description: null
6. Config resource 'file [config\application.properties]' via location 'optional:file:./config/' => app.description: "外部config目录application.properties"
7. Config resource 'file [config\application.yml]' via location 'optional:file:./config/' => app.description: "外部config目录application.yml"
8. Config resource 'file [config\application.yaml]' via location 'optional:file:./config/' => app.description: "外部config目录application.yaml"
9. Config resource 'file [application.properties]' via location 'optional:file:./' => app.description: "外部根目录application.properties"
10. Config resource 'file [application.yml]' via location 'optional:file:./' => app.description: "外部根目录application.yml"
11. Config resource 'file [application.yaml]' via location 'optional:file:./' => app.description: "外部根目录application.yaml"
12. Config resource 'class path resource [config/application.properties]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.properties"
13. Config resource 'class path resource [config/application.yml]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.yml"
14. Config resource 'class path resource [config/application.yaml]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.yaml"
15. Config resource 'class path resource [application.properties]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.properties"
16. Config resource 'class path resource [application.yml]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.yml"
17. Config resource 'class path resource [application.yaml]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.yaml"
==============================================
最终生效的app.description值: 外部config目录application.properties
==============================================
结论:jar包内的配置文件先被加载,但外部配置文件具有更高的优先级。同级目录下config目录优先于根目录。
实验二:验证 Profile 特定加载
java -Dfile.encoding=UTF-8 -jar demo-1.0-SNAPSHOT.jar --spring.profiles.active=prod
输出结果:
==============================================
Spring Boot配置文件加载顺序与优先级演示
==============================================
配置属性源列表(按加载顺序显示):
1. Config resource 'class path resource [application.yaml]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.yaml"
2. Config resource 'class path resource [application.yml]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.yml"
3. Config resource 'class path resource [application.properties]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.properties"
4. Config resource 'class path resource [config/application.yaml]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.yaml"
5. Config resource 'class path resource [config/application.yml]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.yml"
6. Config resource 'class path resource [config/application.properties]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.properties"
7. Config resource 'class path resource [application-prod.yaml]' via location 'optional:classpath:/' => app.description: "jar包内根目录application-prod.yaml"
8. Config resource 'class path resource [application-prod.yml]' via location 'optional:classpath:/' => app.description: "jar包内根目录application-prod.yml"
9. Config resource 'class path resource [application-prod.properties]' via location 'optional:classpath:/' => app.description: "jar包内根目录application-prod.properties"
10. Config resource 'class path resource [config/application-prod.yaml]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application-prod.yaml"
11. Config resource 'class path resource [config/application-prod.yml]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application-prod.yml"
12. Config resource 'class path resource [config/application-prod.properties]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application-prod.properties"
13. Config resource 'file [application.yaml]' via location 'optional:file:./' => app.description: "外部根目录application.yaml"
14. Config resource 'file [application.yml]' via location 'optional:file:./' => app.description: "外部根目录application.yml"
15. Config resource 'file [application.properties]' via location 'optional:file:./' => app.description: "外部根目录application.properties"
16. Config resource 'file [config\application.yaml]' via location 'optional:file:./config/' => app.description: "外部config目录application.yaml"
17. Config resource 'file [config\application.yml]' via location 'optional:file:./config/' => app.description: "外部config目录application.yml"
18. Config resource 'file [config\application.properties]' via location 'optional:file:./config/' => app.description: "外部config目录application.properties"
19. Config resource 'file [application-prod.yaml]' via location 'optional:file:./' => app.description: "外部根目录application-prod.yaml"
20. Config resource 'file [application-prod.yml]' via location 'optional:file:./' => app.description: "外部根目录application-prod.yml"
21. Config resource 'file [application-prod.properties]' via location 'optional:file:./' => app.description: "外部根目录application-prod.properties"
22. Config resource 'file [config\application-prod.yaml]' via location 'optional:file:./config/' => app.description: "外部config目录application-prod.yaml"
23. Config resource 'file [config\application-prod.yml]' via location 'optional:file:./config/' => app.description: "外部config目录application-prod.yml"
24. Config resource 'file [config\application-prod.properties]' via location 'optional:file:./config/' => app.description: "外部config目录application-prod.properties"
25. random => app.description: null
26. systemEnvironment => app.description: null
27. systemProperties => app.description: null
28. servletContextInitParams => app.description: null
29. servletConfigInitParams => app.description: null
30. commandLineArgs => app.description: null
==============================================
配置属性源列表(按优先级从高到低):
1. commandLineArgs => app.description: null
2. servletConfigInitParams => app.description: null
3. servletContextInitParams => app.description: null
4. systemProperties => app.description: null
5. systemEnvironment => app.description: null
6. random => app.description: null
7. Config resource 'file [config\application-prod.properties]' via location 'optional:file:./config/' => app.description: "外部config目录application-prod.properties"
8. Config resource 'file [config\application-prod.yml]' via location 'optional:file:./config/' => app.description: "外部config目录application-prod.yml"
9. Config resource 'file [config\application-prod.yaml]' via location 'optional:file:./config/' => app.description: "外部config目录application-prod.yaml"
10. Config resource 'file [application-prod.properties]' via location 'optional:file:./' => app.description: "外部根目录application-prod.properties"
11. Config resource 'file [application-prod.yml]' via location 'optional:file:./' => app.description: "外部根目录application-prod.yml"
12. Config resource 'file [application-prod.yaml]' via location 'optional:file:./' => app.description: "外部根目录application-prod.yaml"
13. Config resource 'file [config\application.properties]' via location 'optional:file:./config/' => app.description: "外部config目录application.properties"
14. Config resource 'file [config\application.yml]' via location 'optional:file:./config/' => app.description: "外部config目录application.yml"
15. Config resource 'file [config\application.yaml]' via location 'optional:file:./config/' => app.description: "外部config目录application.yaml"
16. Config resource 'file [application.properties]' via location 'optional:file:./' => app.description: "外部根目录application.properties"
17. Config resource 'file [application.yml]' via location 'optional:file:./' => app.description: "外部根目录application.yml"
18. Config resource 'file [application.yaml]' via location 'optional:file:./' => app.description: "外部根目录application.yaml"
19. Config resource 'class path resource [config/application-prod.properties]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application-prod.properties"
20. Config resource 'class path resource [config/application-prod.yml]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application-prod.yml"
21. Config resource 'class path resource [config/application-prod.yaml]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application-prod.yaml"
22. Config resource 'class path resource [application-prod.properties]' via location 'optional:classpath:/' => app.description: "jar包内根目录application-prod.properties"
23. Config resource 'class path resource [application-prod.yml]' via location 'optional:classpath:/' => app.description: "jar包内根目录application-prod.yml"
24. Config resource 'class path resource [application-prod.yaml]' via location 'optional:classpath:/' => app.description: "jar包内根目录application-prod.yaml"
25. Config resource 'class path resource [config/application.properties]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.properties"
26. Config resource 'class path resource [config/application.yml]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.yml"
27. Config resource 'class path resource [config/application.yaml]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.yaml"
28. Config resource 'class path resource [application.properties]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.properties"
29. Config resource 'class path resource [application.yml]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.yml"
30. Config resource 'class path resource [application.yaml]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.yaml"
==============================================
最终生效的app.description值: 外部config目录application-prod.properties
==============================================
结论:
--spring.profiles.active=prod
是配置控制参数--spring.profiles.active=prod
会触发加载所有位置的application-prod.yml
配置文件- jar包内的配置文件先被加载,但外部配置文件具有更高的优先级
- 同级目录下config目录优先于根目录
三、属性值参数优先级验证
实验三:命令行 vs JVM 参数 vs 环境变量
set APP_DESCRIPTION=demo-application-env && java -Dfile.encoding=UTF-8 -Dapp.description="JVM系统属性" \
-jar demo-1.0-SNAPSHOT.jar \
--app.description="应用程序的--命令行参数"
输出结果:
==============================================
Spring Boot配置文件加载顺序与优先级演示
==============================================
配置属性源列表(按加载顺序显示):
1. Config resource 'class path resource [application.yaml]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.yaml"
2. Config resource 'class path resource [application.yml]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.yml"
3. Config resource 'class path resource [application.properties]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.properties"
4. Config resource 'class path resource [config/application.yaml]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.yaml"
5. Config resource 'class path resource [config/application.yml]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.yml"
6. Config resource 'class path resource [config/application.properties]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.properties"
7. Config resource 'file [application.yaml]' via location 'optional:file:./' => app.description: "外部根目录application.yaml"
8. Config resource 'file [application.yml]' via location 'optional:file:./' => app.description: "外部根目录application.yml"
9. Config resource 'file [application.properties]' via location 'optional:file:./' => app.description: "外部根目录application.properties"
10. Config resource 'file [config\application.yaml]' via location 'optional:file:./config/' => app.description: "外部config目录application.yaml"
11. Config resource 'file [config\application.yml]' via location 'optional:file:./config/' => app.description: "外部config目录application.yml"
12. Config resource 'file [config\application.properties]' via location 'optional:file:./config/' => app.description: "外部config目录application.properties"
13. random => app.description: null
14. systemEnvironment => app.description: "demo-application-env "
15. systemProperties => app.description: "JVM系统属性"
16. servletContextInitParams => app.description: null
17. servletConfigInitParams => app.description: null
18. commandLineArgs => app.description: "应用程序的--命令行参数"
==============================================
配置属性源列表(按优先级从高到低):
1. commandLineArgs => app.description: "应用程序的--命令行参数"
2. servletConfigInitParams => app.description: null
3. servletContextInitParams => app.description: null
4. systemProperties => app.description: "JVM系统属性"
5. systemEnvironment => app.description: "demo-application-env "
6. random => app.description: null
7. Config resource 'file [config\application.properties]' via location 'optional:file:./config/' => app.description: "外部config目录application.properties"
8. Config resource 'file [config\application.yml]' via location 'optional:file:./config/' => app.description: "外部config目录application.yml"
9. Config resource 'file [config\application.yaml]' via location 'optional:file:./config/' => app.description: "外部config目录application.yaml"
10. Config resource 'file [application.properties]' via location 'optional:file:./' => app.description: "外部根目录application.properties"
11. Config resource 'file [application.yml]' via location 'optional:file:./' => app.description: "外部根目录application.yml"
12. Config resource 'file [application.yaml]' via location 'optional:file:./' => app.description: "外部根目录application.yaml"
13. Config resource 'class path resource [config/application.properties]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.properties"
14. Config resource 'class path resource [config/application.yml]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.yml"
15. Config resource 'class path resource [config/application.yaml]' via location 'optional:classpath:/config/' => app.description: "jar包内config/application.yaml"
16. Config resource 'class path resource [application.properties]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.properties"
17. Config resource 'class path resource [application.yml]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.yml"
18. Config resource 'class path resource [application.yaml]' via location 'optional:classpath:/' => app.description: "jar包内根目录application.yaml"
==============================================
最终生效的app.description值: 应用程序的--命令行参数
==============================================
结论:命令行参数 > JVM系统属性(-D参数) > 环境变量,符合官方文档定义的优先级顺序。
实验四:自定义配置目录加载验证
java -Dfile.encoding=UTF-8 -Dapp.description="JVM系统属性" \
-jar demo-1.0-SNAPSHOT.jar \
--app.description="命令行参数" \
--spring.config.location=file:./config/ \
--spring.profiles.active=prod
输出结果:
==============================================
Spring Boot配置文件加载顺序与优先级演示
==============================================
配置属性源列表(按加载顺序显示):
1. Config resource 'file [config\application.yaml]' via location 'file:./config/' => app.description: "外部config目录application.yaml"
2. Config resource 'file [config\application.yml]' via location 'file:./config/' => app.description: "外部config目录application.yml"
3. Config resource 'file [config\application.properties]' via location 'file:./config/' => app.description: "外部config目录application.properties"
4. Config resource 'file [config\application-prod.yaml]' via location 'file:./config/' => app.description: "外部config目录application-prod.yaml"
5. Config resource 'file [config\application-prod.yml]' via location 'file:./config/' => app.description: "外部config目录application-prod.yml"
6. Config resource 'file [config\application-prod.properties]' via location 'file:./config/' => app.description: "外部config目录application-prod.properties"
7. random => app.description: null
8. systemEnvironment => app.description: null
9. systemProperties => app.description: "JVM系统属性"
10. servletContextInitParams => app.description: null
11. servletConfigInitParams => app.description: null
12. commandLineArgs => app.description: "命令行参数"
==============================================
配置属性源列表(按优先级从高到低):
1. commandLineArgs => app.description: "命令行参数"
2. servletConfigInitParams => app.description: null
3. servletContextInitParams => app.description: null
4. systemProperties => app.description: "JVM系统属性"
5. systemEnvironment => app.description: null
6. random => app.description: null
7. Config resource 'file [config\application-prod.properties]' via location 'file:./config/' => app.description: "外部config目录application-prod.properties"
8. Config resource 'file [config\application-prod.yml]' via location 'file:./config/' => app.description: "外部config目录application-prod.yml"
9. Config resource 'file [config\application-prod.yaml]' via location 'file:./config/' => app.description: "外部config目录application-prod.yaml"
10. Config resource 'file [config\application.properties]' via location 'file:./config/' => app.description: "外部config目录application.properties"
11. Config resource 'file [config\application.yml]' via location 'file:./config/' => app.description: "外部config目录application.yml"
12. Config resource 'file [config\application.yaml]' via location 'file:./config/' => app.description: "外部config目录application.yaml"
==============================================
最终生效的app.description值: 命令行参数
==============================================
提示:
使用--spring.config.location
会覆盖默认搜索路径;
若想追加额外路径,应使用--spring.config.additional-location
。
结论:
-Dapp.description="JVM系统属性"
和--app.description="命令行参数"
都是属性值参数--spring.config.location=file:./config/
和--spring.profiles.active=prod
是配置控制参数--spring.profiles.active=prod
会触发加载application-prod.yml
配置文件- 虽然
application-prod.yml
被成功加载,但命令行参数--app.description="命令行参数"
仍然具有最高优先级
实验五:外部配置目录优先级验证
java -Dfile.encoding=UTF-8 -jar demo-1.0-SNAPSHOT.jar --spring.config.location=file:./config/
输出结果:
==============================================
Spring Boot配置文件加载顺序与优先级演示
==============================================
配置属性源列表(按加载顺序显示):
1. Config resource 'file [config\application.yaml]' via location 'file:./config/' => app.description: "外部config目录application.yaml"
2. Config resource 'file [config\application.yml]' via location 'file:./config/' => app.description: "外部config目录application.yml"
3. Config resource 'file [config\application.properties]' via location 'file:./config/' => app.description: "外部config目录application.properties"
4. random => app.description: null
5. systemEnvironment => app.description: null
6. systemProperties => app.description: null
7. servletContextInitParams => app.description: null
8. servletConfigInitParams => app.description: null
9. commandLineArgs => app.description: null
==============================================
配置属性源列表(按优先级从高到低):
1. commandLineArgs => app.description: null
2. servletConfigInitParams => app.description: null
3. servletContextInitParams => app.description: null
4. systemProperties => app.description: null
5. systemEnvironment => app.description: null
6. random => app.description: null
7. Config resource 'file [config\application.properties]' via location 'file:./config/' => app.description: "外部config目录application.properties"
8. Config resource 'file [config\application.yml]' via location 'file:./config/' => app.description: "外部config目录application.yml"
9. Config resource 'file [config\application.yaml]' via location 'file:./config/' => app.description: "外部config目录application.yaml"
==============================================
最终生效的app.description值: 外部config目录application.properties
==============================================
结论:
- 使用
--spring.config.location
可以指定自定义配置文件位置 - 自定义位置的配置文件优先级高于默认位置
- 同一目录下不同格式的配置文件加载顺序为:
.properties > .yml > .yaml
四、配置加载机制深入解析
文件加载顺序与覆盖机制
在Spring Boot中,配置文件的加载遵循"后加载覆盖先加载"的原则。这意味着:
- 同一属性在多个配置文件中定义时,后加载的文件中的值会覆盖先加载的文件中的值
- 加载顺序按照优先级从低到高进行,优先级高的位置的文件会后加载
例如,在默认配置下:
- 首先加载
classpath:/application.yaml
(优先级较低) - 然后加载
classpath:/application.yml
- 接着加载
classpath:/application.properties
- 然后加载
classpath:/config/application.yaml
- 依此类推,最后加载
file:./config/application.properties
(优先级最高)
如果app.description
在所有这些文件中都有定义,最终生效的将是file:./config/application.properties
中的值。
为什么--spring.profiles.active=prod
能触发application-prod.yaml
加载?
--spring.profiles.active=prod
是一个配置控制参数,它在Spring Boot的配置加载阶段起作用:
- 在Spring Boot启动过程中,会先解析命令行参数
- 发现
--spring.profiles.active=prod
参数后,会将prod
作为激活的profile - 在配置文件加载阶段,会根据激活的profile,按照优先级顺序加载对应的profile-specific配置文件
- 这个过程发生在属性解析之前,所以即使
--
参数在命令行中排在最后,它仍然能影响配置文件的加载过程
这解释了为什么配置控制参数能够影响配置文件的加载顺序,而不仅仅是属性值的优先级。
五、实践应用总结
场景 | 推荐做法 |
---|---|
多环境配置 | 使用 --spring.profiles.active 切换 |
容器部署 | 通过 --spring.config.location 或挂载 /config |
敏感配置 | 使用环境变量或命令行参数注入 |
六、核心原则总结
- 命令行参数最高优先级
- ⚠️ 外部配置优于内部配置
- 特定环境配置覆盖通用配置
- 同级目录下 config 优先
- 后加载覆盖先加载
- ⚠️ 加载与解析分离:控制与赋值两个阶段
- 同一目录下配置文件格式优先级:
.properties > .yml > .yaml
七、版本注意事项
Spring Boot 3.x 采用全新的 ConfigData 加载机制,
原则一致但底层实现差异较大,建议阅读对应版本文档。
评论区