Spring Boot 加载配置文件的优先级

引言

在Spring Boot中,配置文件是非常重要的一部分,它可以帮助我们配置不同的环境和应用程序的行为。然而,当配置文件很多时,我们需要确保它们的加载顺序和覆盖关系。本文将介绍Spring Boot加载配置文件的优先级,并提供相应的代码示例。

Spring Boot 配置文件的优先级

Spring Boot支持多种配置文件格式,例如.properties.yml。根据配置文件的加载顺序以及配置属性的覆盖规则,我们可以将Spring Boot配置文件的优先级划分为以下几个步骤:

  1. 默认配置文件:Spring Boot会首先加载默认的配置文件,根据不同的环境加载不同的默认配置文件。默认的配置文件包括application.propertiesapplication.yml
  2. 命令行参数:可以通过命令行参数指定配置文件的位置,命令行参数会覆盖默认配置文件中的相同配置属性。
  3. 系统环境变量:Spring Boot会检查系统环境变量,如果有与配置文件中相同的配置属性,则会覆盖之前的配置。
  4. 应用程序配置文件:Spring Boot会加载应用程序指定的配置文件,例如application-dev.propertiesapplication-prod.yml。这些配置文件会覆盖默认配置文件中的相同配置属性。
  5. jar包外部的配置文件:如果在jar包外部存在与配置文件中相同的配置属性,则会覆盖之前的配置。
  6. jar包内部的配置文件:如果在jar包内部存在与配置文件中相同的配置属性,则会覆盖之前的配置。

下图展示了Spring Boot配置文件的加载顺序和覆盖关系:

erDiagram
    config_files ||--|| default_files : has
    command_args ||--o default_files : overrides
    system_env ||--o command_args : overrides
    app_files ||--o system_env : overrides
    external_files ||--o app_files : overrides
    internal_files ||--o app_files : overrides

操作步骤和示例代码

下面将依次介绍每个步骤的操作和相应的示例代码。

1. 默认配置文件

首先,我们需要在src/main/resources目录下创建默认的配置文件application.properties,并添加一些配置属性。例如,我们可以在配置文件中添加一个server.port属性,指定应用程序的端口号为8080。

# application.properties

server.port=8080

2. 命令行参数

如果我们希望通过命令行参数来指定配置文件的位置,可以使用--spring.config.name--spring.config.location参数。其中,--spring.config.name用于指定配置文件的名称(不包括扩展名),--spring.config.location用于指定配置文件的路径。

例如,我们可以通过以下命令行参数来加载名为custom-config.properties的配置文件:

java -jar myapp.jar --spring.config.name=custom-config --spring.config.location=file:/path/to/config/

3. 系统环境变量

我们还可以使用系统环境变量来配置应用程序的属性。例如,我们可以在系统环境变量中设置一个名为SERVER_PORT的变量,它的值会覆盖默认配置文件中的server.port属性。

export SERVER_PORT=8081

4. 应用程序配置文件

如果我们希望根据不同的环境加载不同的配置文件,可以在src/main/resources目录下创建相应的配置文件。例如,我们可以创建application-dev.propertiesapplication-prod.yml,分别用于开发环境和生产环境。

# application-dev.properties

spring.profiles.active=dev
# application-prod.yml

spring:
  profiles:
    active: prod

5. jar包外部的配置文件

除了在应用程序中指定的默认配置文件外,我们还可以在jar包外部提供另一个配置文件。例如,我们可以在jar包所在的目录下创建一个名为`custom-config.properties