好的,Spring Boot的全局配置文件优先级是一个非常重要的概念,它决定了在不同位置的同名配置属性以哪个为准。
Spring Boot 全局配置文件优先级核心知识点 📌
文件格式优先级: 在同一目录下,如果同时存在
application.properties
和application.yml
文件,.properties
文件的优先级高于.yml
文件。这意味着,如果两个文件中定义了相同的属性,将以.properties
文件中的值为准。文件位置加载顺序 (由高到低): Spring Boot会从多个位置加载
application.properties
或application.yml
文件,优先级顺序如下(列表顶部的优先级最高):- 命令行指定的
spring.config.location
: 可以在启动应用时通过命令行参数直接指定配置文件的位置,这个位置的优先级最高。 - 项目根目录下的
/config
子目录: 例如,如果你的 JAR 包在/app/my-app.jar
,那么/app/config/application.properties
的优先级很高。 - 项目根目录: JAR 包所在的目录。例如,
/app/application.properties
。 - 类路径下的
/config
包: 项目src/main/resources/config/
目录下的配置文件。 - 类路径根目录: 项目
src/main/resources/
目录下的配置文件。这是项目中最常用的位置。
- 命令行指定的
Profile特定配置文件的优先级:
- 无论是哪种位置,特定profile的配置文件 (
application-{profile}.properties
) 的优先级总是高于不带profile的默认配置文件 (application.properties
)。 - 例如,如果同时激活了
dev
profile,并且在src/main/resources/
目录下同时存在application.properties
和application-dev.properties
,那么application-dev.properties
中的属性会覆盖application.properties
中的同名属性。
- 无论是哪种位置,特定profile的配置文件 (
外部配置的整体优先级 (更广范围): 配置文件只是Spring Boot外部化配置优先级中的一部分。完整的优先级顺序(部分,从高到低)大致如下:
- 命令行参数:
java -jar my-app.jar --server.port=9090
- ServletConfig / ServletContext 初始化参数
- JNDI 属性
- Java 系统属性 (
System.getProperties()
) - 操作系统环境变量
- Profile特定的应用配置文件 (如
application-{profile}.properties
) - 普通的应用配置文件 (如
application.properties
) @PropertySource
注解指定的配置文件- 默认属性 (通过
SpringApplication.setDefaultProperties
设置)
- 命令行参数:
核心要点总结:
.properties
优先于.yml
(在同一级别)。- 外部配置优先于内部配置 (JAR包外部的配置文件优先于内部的)。
- Profile特定配置优先于通用配置。
- 命令行参数和环境变量可以覆盖所有配置文件中的属性,这使得在不同环境中部署应用变得非常灵活。