在 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
注解指定的配置文件 > 默认的配置类属性。