在Spring Boot项目中,配置属性的优先级是一个重要的概念,它决定了当存在多个配置源时,哪个配置源的属性将被应用。以下是SpringBoot中配置属性的优先级,从最高到最低:
-
命令行参数: 命令行参数具有最高的优先级。SpringBoot项目被启动时,可以通过命令行传递参数,这些参数将覆盖其他所有配置源中的相同属性。
java -jar your-application.jar --spring.datasource.url=jdbc:mysql://localhost:3306/mydb
-
环境变量: 环境变量的优先级高于配置文件。在操作系统中设置的环境变量可以被Spring Boot应用读取,并用于覆盖配置文件中的属性。
-
Java系统属性: 通过Java的
-D
参数设置的系统属性也具有较高的优先级,可以覆盖配置文件中的属性。java -Dspring.datasource.url=jdbc:mysql://localhost:3306/mydb -jar your-application.jar
-
配置文件中的
@PropertySource
注解: 如果在配置类上使用了@PropertySource
注解指定了额外的配置文件,那么这些文件中的属性将按照注解中指定的顺序被加载,具有较高的优先级。 -
配置文件(application.properties 或 application.yml): 位于
src/main/resources
目录下的application.properties
或application.yml
文件中的属性具有中等优先级。如果上述配置源中没有定义某个属性,那么Spring Boot将从这些文件中读取该属性。 -
配置类(
@ConfigurationProperties
): 使用@ConfigurationProperties
注解的配置类中的属性具有较低的优先级。如果上述配置源中没有定义某个属性,那么Spring Boot将从这些配置类中读取该属性。 -
默认值: 当所有配置源中都没有定义某个属性时,Spring Boot将使用该属性的默认值(如果存在)。
示例
假设这里有一个名为 spring.datasource.url
的配置属性,可以在多个地方定义它:
-
命令行参数:
--spring.datasource.url=jdbc:mysql://localhost:3306/mydb
-
环境变量:
SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/mydb
-
Java系统属性:
-Dspring.datasource.url=jdbc:mysql://localhost:3306/mydb
-
@PropertySource
注解指定的配置文件 -
application.properties
或application.yml
文件 -
使用
@ConfigurationProperties
注解的配置类
Spring Boot将按照上述优先级顺序查找这个属性。如果在命令行参数中找到了该属性,那么它将被应用;如果命令行参数中没有定义,那么Spring Boot将继续查找环境变量、系统属性等,直到找到该属性或找不到最终使用默认值。