在 Spring Boot 中,配置文件(如 application.properties 或 application.yml)可以放在多个位置,且存在明确的优先级规则,优先级高的配置会覆盖优先级低的配置。以下是详细说明:
一、配置文件可放置的位置(按优先级从高到低排序)
-
命令行参数
通过java -jar启动时指定的参数,例如:java -jar app.jar --server.port=8081优先级最高,会覆盖其他位置的同名配置。
-
SPRING_APPLICATION_JSON环境变量
以 JSON 格式定义的环境变量,例如:export SPRING_APPLICATION_JSON='{"server":{"port":8082}}'优先级次之,常用于容器化环境(如 Docker)。
-
Servlet 容器相关配置
如 Tomcat 的context.xml等,较少直接使用。 -
application-{profile}.properties/yml(激活的profile配置)
带环境标识的配置文件(如application-dev.properties),优先级高于默认配置,且会与默认配置合并。
激活方式:通过spring.profiles.active=dev指定。 -
application.properties/yml(默认配置)
不带环境标识的主配置文件,会被所有环境共享,优先级低于激活的 profile 配置。 -
配置文件的物理路径(按优先级从高到低)
上述第 4、5 类文件可放在以下路径(优先级从高到低):- 项目根目录下的
config/文件夹(./config/) - 项目根目录(
./) - 类路径(
classpath:)下的config/文件夹(classpath:/config/) - 类路径根目录(
classpath:/,即src/main/resources/目录)
- 项目根目录下的
二、配置读取优先级规则
- 位置优先级:同一类型的配置文件(如都是
application.properties),放在更高优先级路径(如./config/)的会覆盖低优先级路径(如classpath:/)的配置。 - Profile 优先级:激活的
application-{profile}配置会覆盖默认application配置,且两者会合并(非冲突配置共存)。 - 命令行/环境变量优先级:命令行参数和
SPRING_APPLICATION_JSON优先级最高,会覆盖所有配置文件中的同名配置。
示例
假设存在以下配置:
classpath:/application.properties中配置server.port=8080./config/application-dev.properties中配置server.port=8081- 启动命令为
java -jar app.jar --spring.profiles.active=dev --server.port=8082
最终生效的 server.port 是 8082(命令行参数优先级最高)。
总结:Spring Boot 会按优先级从高到低加载所有配置,高优先级配置覆盖低优先级,非冲突配置会合并生效。
注意:本文归作者所有,未经作者允许,不得转载