51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

SpringBoot加载配置文件的优先级,90%的人容易用错!

大家好,我是猿java

在 SpringBoot 应用中,配置文件的加载顺序(优先级)决定了不同来源的配置属性如何覆盖彼此,但是,在实践中,很多人都没有意识到这一点。这篇文章,我们将分析 SpringBoot 配置文件加载的优先级,从高到低排列。

  1. 命令行参数 {#1-命令行参数} ===================

通过命令行(Command-line arguments)传递的参数具有最高优先级。

如下示例,在启动应用时传递命令行参数--server.port=8081

|-----------|------------------------------------------------| | 1 | java -jar myapp.jar --server.port=8081 |

  1. Java 系统属性 {#2-Java-系统属性} ===========================

在启动应用时通过 -D 选项设置的系统属性。

如下示例,在启动应用时设置 -Dserver.port=8081 系统属性:

|-----------|------------------------------------------------| | 1 | java -Dserver.port=8081 -jar myapp.jar |

  1. 操作系统环境变量 {#3-操作系统环境变量} =========================

设置在操作系统级别的环境变量。例如,SERVER_PORT=8081

4.random 配置属性源(Random Configuration Property Sources):** {#4-random-配置属性源(Random-Configuration-Property-Sources):}

包括 random.* 属性,用于生成随机数或其他随机相关的配置。

  1. application.{profile}.propertiesapplication.{profile}.yml 文件 {#5-application-profile-properties-或-application-profile-yml-文件} =======================================================================================================================================

基于当前激活的 Spring Profile 加载的配置文件。例如,如果激活了 dev 环境,则加载 application-dev.properties

  1. application.propertiesapplication.yml 文件 {#6-application-properties-或-application-yml-文件} ===================================================================================================

默认的配置文件,通常位于 src/main/resources 目录下。

  1. @PropertySource 注解指定的属性文件 {#7-PropertySource-注解指定的属性文件} ============================================================
  • 通过在配置类上使用 @PropertySource 注解加载的自定义属性文件。
  1. 默认属性 {#8-默认属性} =================

使用 SpringApplication.setDefaultProperties 设定的默认属性。

配置文件的搜索顺序 {#配置文件的搜索顺序}

Spring Boot 在不同位置搜索 application.propertiesapplication.yml 文件,以下是搜索的顺序,从高到低优先级:

  1. 外部位置(当前目录、上级目录等):

    • file:./config/
    • file:./
    • file:../config/
    • file:../

    这意味着如果你在应用程序的当前目录或其上级目录中有配置文件,这些文件的优先级高于类路径下的配置文件。

  2. 类路径下的 /config 子目录:

    • classpath:/config/
  3. 类路径根目录:

    • classpath:/

配置优先级示例 {#配置优先级示例}

假设存在以下配置来源:

  • application.properties 在类路径根目录中设置 server.port=8080
  • application-dev.properties 在类路径下的 config 目录中设置 server.port=8081
  • 外部 application.properties 文件设置 server.port=8082
  • 命令行参数传递 --server.port=8083

在激活 dev Profile 的情况下,最终 server.port 的值将是 8083。这是因为命令行参数的优先级最高,覆盖了其他所有配置来源。

激活 Profile {#激活-Profile}

可以通过以下方式激活特定的 Spring Profile:

  • 命令行参数:

    |-----------|----------------------------------------------------------| | 1 | java -jar myapp.jar --spring.profiles.active=dev |

  • 环境变量:
    设置 SPRING_PROFILES_ACTIVE=dev

  • 配置文件:
    application.properties 中设置 spring.profiles.active=dev

属性覆盖规则 {#属性覆盖规则}

  • 同一属性名在多个来源中定义时,优先级高的来源会覆盖低的。例如:

    • application.properties 中定义 app.name=MyApp
    • 外部 application.properties 中定义 app.name=ExternalApp

    若外部位置的配置文件优先级更高,则最终 app.nameExternalApp

总结 {#总结}

了解 Spring Boot 的配置文件加载优先级有助于:

  • 正确组织和管理配置文件,确保不同环境下的配置正确应用。
  • 避免意外覆盖,通过明确的优先级控制哪些配置生效。
  • 优化配置管理流程,尤其是在复杂项目或多环境部署时。
  1. 学习交流 {#10-学习交流} ===================
赞(0)
未经允许不得转载:工具盒子 » SpringBoot加载配置文件的优先级,90%的人容易用错!