10. Spring Boot 配置文件加载优先级你知道吗?
大约 3 分钟
Spring Boot 在启动时会加载多个配置文件,并且这些配置文件有特定的加载优先级。这些配置文件可以包含应用程序的属性、环境变量等,它们的加载顺序和优先级决定了最终生效的配置值。
Spring Boot 配置文件加载顺序与优先级
Spring Boot 会按照以下顺序加载配置文件,后加载的配置文件可以覆盖之前加载的相同属性的值:
application.properties
或application.yml
文件:外部配置文件
:位于以下位置的配置文件优先级从高到低排列:
config/
子目录下的配置文件:例如,file:./config/application.properties
或file:./config/application.yml
。- 当前目录下的配置文件:例如,
file:./application.properties
或file:./application.yml
。 classpath:/config/
子目录下的配置文件:例如,classpath:/config/application.properties
或classpath:/config/application.yml
。classpath:/
根目录下的配置文件:例如,classpath:/application.properties
或classpath:/application.yml
。
命令行参数:
- 启动应用时传递的命令行参数具有最高的优先级,命令行参数中的属性会覆盖所有其他配置文件中的相同属性。
@TestPropertySource
注解:- 当进行集成测试时,如果使用了
@TestPropertySource
注解指定了额外的属性文件,这些属性将覆盖常规的配置文件。
- 当进行集成测试时,如果使用了
SpringApplication.setDefaultProperties
:- 通过
SpringApplication.setDefaultProperties(Map<String, Object>)
方法设置的默认属性,具有较低的优先级,但仍能覆盖默认的配置文件值。
- 通过
操作系统环境变量:
- 系统环境变量优先级高于配置文件,但低于命令行参数。
Java 系统属性:
- 通过
System.getProperties()
获取的属性(通常通过 JVM 参数-Dkey=value
设置),优先级低于环境变量,但高于外部配置文件。
- 通过
application.properties
或application.yml
中的 profile-specific 配置文件:- Spring Boot 支持按环境配置不同的属性文件,如
application-{profile}.properties
或application-{profile}.yml
,这些文件在激活的 profile 环境下被加载,其优先级低于外部配置文件和命令行参数。
- Spring Boot 支持按环境配置不同的属性文件,如
@PropertySource
注解:- 可以在 Spring 的
@Configuration
类中通过@PropertySource
注解引入额外的属性文件。这些属性文件的优先级低于上述的外部配置文件。
- 可以在 Spring 的
默认配置文件:
- 如果在其他地方没有设置属性的值,则使用
application.properties
或application.yml
文件中指定的默认值,或者使用代码中的硬编码默认值。
- 如果在其他地方没有设置属性的值,则使用
配置文件的覆盖和合并
- 覆盖:在加载过程中,如果后续加载的配置文件中存在相同的属性键,后者的值将覆盖之前的值。例如,命令行参数可以覆盖任何配置文件中的值。
- 合并:如果属性值本身是一个集合(如列表或映射),Spring Boot 会将多个来源的值合并,而不是简单的覆盖。
示例:多环境配置
假设你有以下几个配置文件:
application.properties
application-dev.properties
application-prod.properties
file:./config/application.properties
classpath:/config/application.properties
如果你通过命令行参数指定 --spring.profiles.active=dev
,那么 Spring Boot 会按如下顺序加载配置文件:
- 命令行参数中的属性(最高优先级)。
file:./config/application.properties
(外部配置文件,config/
目录下的文件优先级最高)。classpath:/config/application.properties
。application-dev.properties
(因为dev
profile 被激活)。application.properties
(默认配置文件,最低优先级)。
总结
Spring Boot 配置文件的加载顺序是通过一系列有序的优先级规则来决定的。命令行参数的优先级最高,其次是外部配置文件、环境变量和 Java 系统属性,最后才是默认的 application.properties
或 application.yml
。通过了解这些优先级,可以更好地控制应用程序的配置,确保在不同的环境下加载正确的属性值。