加载顺序(Loading Order)
加载顺序指的是配置文件被读取和解析的先后顺序。Spring Boot在启动过程中会按照一定的顺序加载配置文件,确保某些配置在其他配置之前生效。具体顺序如下:
-
bootstrap文件bootstrap.properties或bootstrap.yml文件在SpringApplication实例化之前加载。这些文件通常用于配置系统级别的参数,例如配置中心的连接信息、加密密钥等。这些参数需要在应用启动的早期阶段就加载,以确保应用能够正确连接到配置中心等系统级别的服务。- 加载顺序:
bootstrap.properties>bootstrap.yml
-
application文件application.properties或application.yml文件在SpringApplication实例化之后加载。这些文件通常用于配置应用级别的参数,例如数据库连接信息、服务端口等。这些参数对应用的运行至关重要,但可以在bootstrap文件加载之后再生效。- 加载顺序:
application.properties>application.yml
优先级(Priority)
优先级指的是当多个配置文件中存在相同的属性时,哪个属性值最终生效。Spring Boot会根据配置文件的优先级来决定哪个属性值会被使用。具体优先级如下:
-
命令行参数
- 通过命令行传递的参数具有最高优先级,例如
java -jar myapp.jar --server.port=8081。
- 通过命令行传递的参数具有最高优先级,例如
-
Java系统属性
- 在启动应用时通过
-D选项设置的系统属性,例如java -Dserver.port=8081 -jar myapp.jar。
- 在启动应用时通过
-
操作系统环境变量
- 设置在操作系统级别的环境变量,例如
SERVER_PORT=8081。
- 设置在操作系统级别的环境变量,例如
-
随机数配置属性源
- 包括
random.*属性,用于生成随机数或其他随机相关的配置。
- 包括
-
基于当前激活的Spring Profile加载的配置文件
application-{profile}.properties或application-{profile}.yml文件,例如激活了dev环境,则加载application-dev.properties。
-
默认的配置文件
application.properties或application.yml文件,通常位于src/main/resources目录下。
-
@PropertySource注解指定的属性文件
- 通过在配置类上使用
@PropertySource注解加载的自定义属性文件。
- 通过在配置类上使用
-
默认属性
- 使用
SpringApplication.setDefaultProperties设定的默认属性。
- 使用
相同属性的优先级
对于相同属性,Spring Boot会按照以下优先级顺序处理:
-
命令行参数
-
Java系统属性
-
操作系统环境变量
-
随机数配置属性源
-
基于当前激活的Spring Profile加载的配置文件
-
默认的配置文件
application.properties>application.yml
-
@PropertySource注解指定的属性文件
-
默认属性
不同属性的加载顺序
对于不同属性,Spring Boot会按照以下加载顺序处理:
-
bootstrap文件bootstrap.properties>bootstrap.yml
-
application文件application.properties>application.yml
示例
假设我们有以下配置文件:
-
bootstrap.properties:properties复制
server.port=8080 spring.cloud.config.uri=http://config-server:8888 -
application.properties:properties复制
server.port=8081 -
application.yml:yaml复制
server: port: 8082
属性值的最终生效顺序
-
命令行参数:如果通过命令行参数设置了
server.port=8083,那么最终生效的将是8083。 -
Java系统属性:如果通过
-Dserver.port=8084设置了系统属性,那么最终生效的将是8084。 -
操作系统环境变量:如果设置了环境变量
SERVER_PORT=8085,那么最终生效的将是8085。 -
随机数配置属性源:如果有随机数配置,优先级较低。
-
基于当前激活的Spring Profile加载的配置文件:如果有
application-dev.properties,优先级高于默认的application.properties和application.yml。 -
默认的配置文件:
application.properties中的server.port=8081会覆盖bootstrap.properties中的server.port=8080。application.yml中的server.port=8082会覆盖application.properties中的server.port=8081。
总结
- 加载顺序:
bootstrap.properties>bootstrap.yml>application.properties>application.yml - 优先级:命令行参数 > Java系统属性 > 操作系统环境变量 > 随机数配置属性源 > 基于当前激活的Spring Profile加载的配置文件 >
application.properties>application.yml>