Spring Boot 配置文件的优先级

84 阅读4分钟

Spring Boot 配置文件的优先级

Taimili 艾米莉 ( 一款免费开源的 taimili.com )

艾米莉 是一款优雅便捷的 GitHub Star 管理和加星工具,基于 PHP & javascript 构建, 能对github 得 star fork follow watch 管理和提升,最适合github 的深度用户

image.png

作者:开源之眼
链接:juejin.cn/post/754971…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Spring Boot 是一个非常流行的 Java 开发框架,它能够简化 Spring 应用程序的配置和部署。Spring Boot 的配置文件具有层次结构和优先级,开发人员可以根据需要灵活配置应用程序的行为。了解配置文件的优先级,对于调试和管理复杂应用程序至关重要。

在 Spring Boot 中,配置文件的优先级决定了多个配置来源之间的覆盖规则。Spring Boot 支持通过不同的方式来定义和修改应用程序的配置,包括 application.propertiesapplication.yml 文件、命令行参数、环境变量等。本文将介绍 Spring Boot 配置文件的优先级和加载顺序。

1. Spring Boot 配置文件概述

Spring Boot 支持两种常见的配置格式:

  • application.properties:传统的键值对格式
  • application.yml:YAML 格式,支持层级结构,通常更具可读性

这两个文件可以分别或者共同存在于项目中,Spring Boot 会根据优先级加载其中的配置。

2. 配置文件的优先级顺序

Spring Boot 根据以下优先级顺序来加载配置文件,优先级越高的配置覆盖优先级越低的配置。

  1. 命令行参数:命令行启动时传入的参数优先级最高。通过 --<property-name>=<value> 的方式传递。例如:

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

    这样传入的 server.port 配置会覆盖配置文件中的同名配置。

  2. Java System 属性(JVM 参数):可以通过 JVM 启动参数传递,例如:

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

    这种方式的优先级低于命令行参数,但高于 application.propertiesapplication.yml 文件。

  3. 操作系统环境变量:操作系统的环境变量也可以用来配置 Spring Boot。例如,在 Linux 或 macOS 中,可以通过以下命令设置环境变量:

    export SERVER_PORT=8081
    java -jar myapp.jar
    

    环境变量的优先级低于命令行参数和 JVM 参数,但高于配置文件。

  4. 配置文件(application.propertiesapplication.yml

    • application.propertiesapplication.yml 文件的优先级较低,它们通常作为默认的配置文件加载。

    • Spring Boot 会按照不同的配置文件位置和命名来加载:

      • 默认情况下,Spring Boot 会加载项目中的 src/main/resources/application.propertiessrc/main/resources/application.yml 文件。
      • 如果应用程序在多个环境下运行,还可以使用不同的配置文件来区分不同环境的配置。例如,application-dev.propertiesapplication-prod.yml
    • 在不同的环境中,Spring Boot 会根据激活的配置文件来加载相应的文件。例如,开发环境下使用 application-dev.properties,生产环境下使用 application-prod.properties。通过以下命令激活不同的配置文件:

      java -jar myapp.jar --spring.profiles.active=dev
      
  5. Spring Boot 默认配置:如果没有找到相应的配置,Spring Boot 会使用其内部的默认配置。可以查看官方文档来了解各个配置项的默认值。

3. 配置文件位置的优先级

Spring Boot 支持从多个位置加载配置文件,优先级如下:

  1. file:/<config-location>/:外部配置文件目录
  2. classpath:/config/:类路径下的 config 目录
  3. classpath:/:类路径根目录
  4. file:/:文件系统的根目录

通过这些不同的目录位置,Spring Boot 允许你灵活地管理和覆盖配置文件。

4. 示例:优先级覆盖

假设我们有如下配置文件:

application.properties(默认配置)

server.port=8080

application-dev.properties(开发环境配置)

server.port=8081

application-prod.properties(生产环境配置)

server.port=8090

我们可以通过以下方式来启动不同的配置环境:

  • 在开发环境中,通过 application-dev.properties 配置文件启动:

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

    此时,server.port 被设置为 8081

  • 在生产环境中,通过 application-prod.properties 配置文件启动:

    java -jar myapp.jar --spring.profiles.active=prod
    

    此时,server.port 被设置为 8090

  • 如果没有指定 --spring.profiles.active,则使用 application.properties 中的配置,server.port 默认值为 8080

Spring Boot 配置文件的优先级机制允许开发人员根据不同的环境和需求灵活地调整应用程序的配置。命令行参数、JVM 参数和操作系统环境变量具有较高的优先级,而配置文件则按照优先级顺序进行加载。通过这种机制,Spring Boot 使得开发人员能够灵活地管理不同环境下的配置,简化了配置管理的复杂性。