MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

Spring boot加载顺序

2025-02-26 12:23 huorong 精选文章 1 ℃ 0 评论

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

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言