Spring Boot 的配置加载顺序遵循特定规则,**优先级高的配置会覆盖低优先级的配置**。以下是常见的配置源及其加载顺序(从高到低):
---
### **1. 命令行参数(最高优先级)**
- 通过 `--key=value` 在启动命令中传递的参数。
- 示例:`java -jar app.jar --server.port=8081`
---
### **2. 环境变量**
- 操作系统或容器(如 Docker)设置的环境变量。
- 示例:`export SPRING_DATASOURCE_URL=jdbc:mysql://localhost/db`
---
### **3. 系统属性(`System.getProperties()`)**
- 通过 `-Dkey=value` 设置的 Java 系统属性。
- 示例:`java -Dserver.port=8082 -jar app.jar`
---
### **4. Profile 专属的外部配置文件**
- **外部化配置**的优先级高于 JAR 包内配置,路径包括:
1. 当前目录下的 `./config/` 子目录。
2. 当前目录(JAR 所在目录)。
3. `classpath:/config/`。
4. `classpath:/`(默认的 `resources` 目录)。
- **加载顺序**:路径优先级从上到下递减,例如 `./config/` 的配置会覆盖 `classpath:/`。
- **Profile 专属文件**(如 `application-{profile}.yml`)会覆盖通用配置。
---
### **5. JAR 包内的配置文件**
- `
classpath:/config/application.yml` 或 `
classpath:/application.yml`。
- Profile 专属文件(如 `application-dev.yml`)优先于通用文件。
---
### **6. `@PropertySource` 注解**
- 代码中通过 `@PropertySource` 显式指定的配置文件。
- 示例:`@PropertySource("
classpath:custom.properties")`
---
### **7. 默认属性(`
SpringApplication.setDefaultProperties`)**
- 通过代码设置的默认属性,优先级最低。
- 示例:
```java
SpringApplication app = new SpringApplication(MyApp.class);
app.setDefaultProperties(Collections.singletonMap("key", "default"));
```
---
### **Profile 激活规则**
- **激活的 Profile** 的配置会覆盖默认配置。
- 例如,若激活 `dev` Profile,则 `application-dev.yml` 的配置优先于 `application.yml`。
- 多个 Profile 按声明顺序加载,后声明的 Profile 优先级更高。
---
### **配置加载顺序总结表**
| 优先级 | 配置源 | 示例/说明 |
|--------|----------------------------|---------------------------------------|
| 1 | 命令行参数 | `--server.port=8081` |
| 2 | 环境变量 | `SPRING_DATASOURCE_URL=xxx` |
| 3 | 系统属性(`-D`) | `-Dserver.port=8082` |
| 4 | 外部 Profile 配置文件 | `
./config/application-dev.yml` |
| 5 | 外部默认配置文件 | `./application.yml` |
| 6 | JAR 内 Profile 配置文件 | `
classpath:/application-dev.yml` |
| 7 | JAR 内默认配置文件 | `
classpath:/application.yml` |
| 8 | `@PropertySource` 指定文件 | `@PropertySource("custom.properties")`|
| 9 | 默认属性(代码设置) | `
SpringApplication.setDefaultProperties` |
---
### **示例场景**
假设以下配置同时存在:
1. 命令行参数:`--server.port=8081`
2. 环境变量:`SERVER_PORT=8082`
3. `./config/application.yml` 中 `server.port: 8083`
4. JAR 内的 `application.yml` 中 `server.port: 8084`
**最终生效的端口是 `8081`**,因为命令行参数优先级最高。
---
通过理解配置加载顺序,可以更高效地管理不同环境(开发、测试、生产)的配置,并快速排查配置冲突问题。
Tags:propertysource