目 录CONTENT

文章目录

SpringBoot配置文件加载顺序与参数优先级详解

Administrator
2025-10-11 / 0 评论 / 0 点赞 / 11 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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顺序,旨在允许合理地覆盖值。属性按以下顺序考虑(优先级从低到高):

  1. 默认属性(通过SpringApplication.setDefaultProperties指定)
  2. @PropertySource注解在@Configuration类上定义的属性
  3. 配置数据文件(如application.properties等)
  4. RandomValuePropertySource,只包含random.*属性
  5. 操作系统环境变量
  6. Java系统属性(System.getProperties())
  7. 来自java:comp/env的JNDI属性
  8. ServletContext初始化参数
  9. ServletConfig初始化参数
  10. SPRING_APPLICATION_JSON中的属性(环境变量或系统属性中内嵌的JSON)
  11. 命令行参数
  12. 测试属性(@SpringBootTest#properties属性等)

二、配置文件加载顺序与优先级

在配置文件加载方面,Spring Boot遵循特定的搜索顺序和优先级规则。

配置文件搜索位置

Spring Boot按以下顺序搜索配置文件(从高优先级到低优先级):

  1. 当前目录下的/config子目录(外部配置)
  2. 当前目录(外部配置)
  3. classpath下的/config包(内部配置)
  4. classpath根目录(内部配置)

这意味着外部配置文件(位于jar包外部)优先级高于内部配置文件(位于jar包内部)。

同一目录下不同格式配置文件的处理

在同一目录下,Spring Boot会加载所有格式的配置文件(.properties、.yml、.yaml),但它们的优先级如下:

  1. .properties(最高优先级)
  2. .yml
  3. .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
==============================================

结论:

  1. --spring.profiles.active=prod是配置控制参数
  2. --spring.profiles.active=prod会触发加载所有位置的application-prod.yml配置文件
  3. jar包内的配置文件先被加载,但外部配置文件具有更高的优先级
  4. 同级目录下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

结论:

  1. -Dapp.description="JVM系统属性"--app.description="命令行参数"都是属性值参数
  2. --spring.config.location=file:./config/--spring.profiles.active=prod是配置控制参数
  3. --spring.profiles.active=prod会触发加载application-prod.yml配置文件
  4. 虽然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
==============================================

结论:

  1. 使用--spring.config.location可以指定自定义配置文件位置
  2. 自定义位置的配置文件优先级高于默认位置
  3. 同一目录下不同格式的配置文件加载顺序为:.properties > .yml > .yaml

四、配置加载机制深入解析

文件加载顺序与覆盖机制

在Spring Boot中,配置文件的加载遵循"后加载覆盖先加载"的原则。这意味着:

  1. 同一属性在多个配置文件中定义时,后加载的文件中的值会覆盖先加载的文件中的值
  2. 加载顺序按照优先级从低到高进行,优先级高的位置的文件会后加载

例如,在默认配置下:

  1. 首先加载classpath:/application.yaml (优先级较低)
  2. 然后加载classpath:/application.yml
  3. 接着加载classpath:/application.properties
  4. 然后加载classpath:/config/application.yaml
  5. 依此类推,最后加载file:./config/application.properties (优先级最高)

如果app.description在所有这些文件中都有定义,最终生效的将是file:./config/application.properties中的值。

为什么--spring.profiles.active=prod能触发application-prod.yaml加载?

--spring.profiles.active=prod是一个配置控制参数,它在Spring Boot的配置加载阶段起作用:

  1. 在Spring Boot启动过程中,会先解析命令行参数
  2. 发现--spring.profiles.active=prod参数后,会将prod作为激活的profile
  3. 在配置文件加载阶段,会根据激活的profile,按照优先级顺序加载对应的profile-specific配置文件
  4. 这个过程发生在属性解析之前,所以即使--参数在命令行中排在最后,它仍然能影响配置文件的加载过程

这解释了为什么配置控制参数能够影响配置文件的加载顺序,而不仅仅是属性值的优先级。

五、实践应用总结

场景推荐做法
多环境配置使用 --spring.profiles.active 切换
容器部署通过 --spring.config.location 或挂载 /config
敏感配置使用环境变量或命令行参数注入

六、核心原则总结

  1. 命令行参数最高优先级
  2. ⚠️ 外部配置优于内部配置
  3. 特定环境配置覆盖通用配置
  4. 同级目录下 config 优先
  5. 后加载覆盖先加载
  6. ⚠️ 加载与解析分离:控制与赋值两个阶段
  7. 同一目录下配置文件格式优先级:.properties > .yml > .yaml

七、版本注意事项

Spring Boot 3.x 采用全新的 ConfigData 加载机制,
原则一致但底层实现差异较大,建议阅读对应版本文档。

参考文档

  1. Spring Boot官方文档 - Externalized Configuration
  2. Spring Boot Properties and Configuration
  3. Spring Framework - PropertySource
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区