在 Spring Boot 应用中,配置文件的加载是一个重要的环节,它允许开发者根据不同的环境和需求来配置应用程序。Spring Boot 支持多种配置文件格式(如 .properties、.yml、.yaml),并且存在不同的配置文件加载位置和方式,这些加载源之间有特定的优先级顺序。以下是详细的 Spring Boot 配置文件加载优先级说明:
1. 命令行参数
命令行参数具有最高的优先级。当你启动 Spring Boot 应用时,可以通过命令行传递配置参数,格式为 --key=value。例如:
java -jar myapp.jar --server.port=8081
这里通过命令行参数将应用的端口号设置为 8081,会覆盖其他配置文件中相同属性的设置。
2. Java 系统属性(System.getProperties())
Java 系统属性的优先级仅次于命令行参数。可以在启动 Java 应用时使用 -D 选项来设置系统属性。例如:
java -Dserver.port=8082 -jar myapp.jar
这里将 server.port 属性设置为 8082,会覆盖除命令行参数外其他配置文件中该属性的设置。
3. 操作系统环境变量
操作系统环境变量也可以作为配置源,其优先级低于 Java 系统属性。例如,在 Linux 系统中,可以通过 export 命令设置环境变量:
export SERVER_PORT=8083
java -jar myapp.jar
这里将 SERVER_PORT 环境变量设置为 8083,Spring Boot 会将其转换为 server.port 属性并应用,会覆盖后续配置文件中该属性的设置。
4. RandomValuePropertySource(用于生成随机值)
RandomValuePropertySource 主要用于生成随机值,例如随机端口、随机字符串等。可以在配置文件中使用 ${random.*} 表达式来引用这些随机值。例如:
myapp.secret=${random.value}
该配置会为 myapp.secret 属性赋予一个随机生成的值。不过它主要用于生成值,并非用于常规配置的覆盖,优先级低于上述配置源。
5. 应用外部的 application-{profile}.properties 或 application-{profile}.yml 文件
这里的 {profile} 表示 Spring 的配置文件(如 dev、prod 等)。应用外部指的是在应用的 JAR 文件所在目录之外。例如,在 JAR 文件所在目录的同级目录下创建 application-dev.properties 文件,其内容如下:
server.port=8084
当激活 dev 配置文件时,该文件中的配置会生效,并且会覆盖后续配置文件中相同属性的设置。
6. 应用内部的 application-{profile}.properties 或 application-{profile}.yml 文件
应用内部指的是在应用的 JAR 文件内部的 classpath 下。例如,在 src/main/resources 目录下创建 application-dev.properties 文件,其内容如下:
server.port=8085
当激活 dev 配置文件时,该文件中的配置会生效,但优先级低于应用外部的同名配置文件。
7. 应用外部的 application.properties 或 application.yml 文件
同样,应用外部指的是在应用的 JAR 文件所在目录之外。例如,在 JAR 文件所在目录的同级目录下创建 application.properties 文件,其内容如下:
server.port=8086
该文件中的配置会生效,并且会覆盖应用内部的 application.properties 文件中相同属性的设置。
8. 应用内部的 application.properties 或 application.yml 文件
应用内部指的是在应用的 JAR 文件内部的 classpath 下。例如,在 src/main/resources 目录下创建 application.properties 文件,其内容如下:
server.port=8087
该文件中的配置是最基础的配置,优先级最低,会被前面提到的各种配置源覆盖。
9. @PropertySource 注解指定的配置文件
在 Spring Boot 应用中,可以使用 @PropertySource 注解在 Java 代码中指定额外的配置文件。例如:
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.Configuration;
@Configuration
@PropertySource("classpath:custom.properties")
public class AppConfig {
// 配置类内容
}
custom.properties 文件中的配置会被加载,但优先级低于上述大部分配置源,仅高于默认的配置类属性。
10. 默认的配置类属性
Spring Boot 应用中使用 @Configuration 注解的配置类中定义的属性具有最低的优先级。例如:
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Configuration
@ConfigurationProperties(prefix = "myapp")
public class MyAppConfig {
private String name = "DefaultName";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这里 MyAppConfig 类中定义的 name 属性值 DefaultName 是默认值,如果在其他配置源中定义了 myapp.name 属性,会覆盖该默认值。
综上所述,Spring Boot 配置文件的加载优先级从高到低依次为:命令行参数 > Java 系统属性 > 操作系统环境变量 > RandomValuePropertySource > 应用外部的 application-{profile}.properties 或 application-{profile}.yml 文件 > 应用内部的 application-{profile}.properties 或 application-{profile}.yml 文件 > 应用外部的 application.properties 或 application.yml 文件 > 应用内部的 application.properties 或 application.yml 文件 > @PropertySource 注解指定的配置文件 > 默认的配置类属性。