SpringBoot配置文件加载顺序

发布于:2025-02-15 ⋅ 阅读:(81) ⋅ 点赞:(0)

在 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}.propertiesapplication-{profile}.yml 文件

这里的 {profile} 表示 Spring 的配置文件(如 devprod 等)。应用外部指的是在应用的 JAR 文件所在目录之外。例如,在 JAR 文件所在目录的同级目录下创建 application-dev.properties 文件,其内容如下:

server.port=8084

当激活 dev 配置文件时,该文件中的配置会生效,并且会覆盖后续配置文件中相同属性的设置。

6. 应用内部的 application-{profile}.propertiesapplication-{profile}.yml 文件

应用内部指的是在应用的 JAR 文件内部的 classpath 下。例如,在 src/main/resources 目录下创建 application-dev.properties 文件,其内容如下:

server.port=8085

当激活 dev 配置文件时,该文件中的配置会生效,但优先级低于应用外部的同名配置文件。

7. 应用外部的 application.propertiesapplication.yml 文件

同样,应用外部指的是在应用的 JAR 文件所在目录之外。例如,在 JAR 文件所在目录的同级目录下创建 application.properties 文件,其内容如下:

server.port=8086

该文件中的配置会生效,并且会覆盖应用内部的 application.properties 文件中相同属性的设置。

8. 应用内部的 application.propertiesapplication.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}.propertiesapplication-{profile}.yml 文件 > 应用内部的 application-{profile}.propertiesapplication-{profile}.yml 文件 > 应用外部的 application.propertiesapplication.yml 文件 > 应用内部的 application.propertiesapplication.yml 文件 > @PropertySource 注解指定的配置文件 > 默认的配置类属性。


网站公告

今日签到

点亮在社区的每一天
去签到