Spring Boot 配置加载顺序
Spring Boot 在启动时按照以下顺序加载配置属性(从优先级低到高):
1. **默认属性**
- Spring Boot 内置的一些默认配置属性。
2. **`@PropertySource` 注解中的属性**
- 在 `@Configuration` 类中使用 `@PropertySource` 注解指定的属性文件。
3. **`SpringApplication.setDefaultProperties`**
- 在 SpringApplication 实例中设置的默认属性。
4. **操作系统环境变量**
- 系统级环境变量,例如 `SPRING_DATASOURCE_URL`。
5. **Java 系统属性**
- JVM 系统属性,例如通过 `-D` 选项设置的属性。
6. **配置文件外部化属性**
- 应用程序外部化的配置文件,例如 `application.properties` 或 `application.yml`,存储在外部位置,可以通过命令行参数 `--spring.config.location` 指定。
7. **应用程序的配置文件**
- `application.properties` 或 `application.yml`,存储在 `src/main/resources` 或 `src/main/resources/config` 目录中。
8. **命令行参数**
- 在应用程序启动时通过命令行传递的参数,例如 `--server.port=8081`。
示例
假设在应用程序中存在以下配置源:
- 默认属性
- `application.properties` 文件中的属性
- 命令行参数
**`application.properties` 文件:**
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
**命令行参数:**
java -jar myapp.jar --server.port=9090
在这种情况下,`server.port` 属性的最终值将是 `9090`,因为命令行参数具有最高优先级。
### 配置加载顺序的实际应用
了解配置加载顺序的实际应用有助于更好地管理和覆盖配置属性。例如,可以使用不同的配置文件来管理开发、测试和生产环境中的配置。
**多环境配置示例:**
在 `src/main/resources` 目录下创建不同的配置文件,例如:
- `application-dev.properties`
- `application-test.properties`
- `application-prod.properties`
通过设置 `spring.profiles.active` 属性来选择激活的配置文件:
**`application.properties` 文件:**
spring.profiles.active=dev
### 代码示例:加载和覆盖配置属性
假设我们有一个配置类 `MyAppProperties`,它使用 `@ConfigurationProperties` 注解来绑定配置属性:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {
private String name;
private int port;
// Getters and Setters
}
**`application.properties` 文件:**
myapp.name=SpringBootApp
myapp.port=8080
**命令行参数:**
java -jar myapp.jar --myapp.port=9090
在这种情况下,`myapp.port` 的值将被命令行参数覆盖为 `9090`。
Spring Boot 2.x 配置属性源的详细顺序
以下是 Spring Boot 2.x 中配置属性的详细加载顺序(从优先级低到高):
1. **默认属性**(通过 `SpringApplication.setDefaultProperties` 设置)
2. **`@PropertySource` 注解中的属性**
3. **配置文件中的属性**
- `application.properties` 或 `application.yml`(`src/main/resources` 或 `src/main/resources/config`)
- 外部化配置文件(通过 `spring.config.location` 指定)
4. **操作系统环境变量**
5. **Java 系统属性**
6. **命令行参数**
总结
-
命令行参数:可以在运行 Spring Boot 应用时指定命令行参数,这些参数会覆盖在配置文件中定义的相同属性。
-
SPRING_APPLICATION_JSON:可以通过环境变量 SPRING_APPLICATION_JSON 来设置一些配置属性,它的值是一个 JSON 字符串。
-
Java System 属性:可以通过在运行应用程序之前设置 Java 系统属性来配置应用程序的属性。
-
操作系统环境变量:系统环境变量中的属性会被自动加载到 Spring Boot 的环境变量中。
-
RandomValuePropertySource:Spring Boot 在创建环境时会添加一个 RandomValuePropertySource,它可以用来生成随机值。
-
Jar 包外的 application.properties 或 application.yml 文件:Spring Boot 会自动加载 classpath 下的 application.properties 或 application.yml 文件,优先加载 yml 文件。
-
Jar 包内的 application.properties 或 application.yml 文件:如果应用程序打包为 JAR 文件,那么 Spring Boot 会优先加载 JAR 文件内部的配置文件。
-
通过 @PropertySource 注解加载的配置文件:可以使用 @PropertySource 注解来加载额外的配置文件。
-
默认属性:Spring Boot 提供了一些默认属性,它们可以在应用程序中使用。