application.yml 和 application-prod.yml 关系及加载顺序

在 Spring Boot 项目中,application.ymlapplication-prod.yml 是两种常见的配置文件。它们之间的关系和加载顺序由 Spring Boot 的 配置文件加载机制 决定。以下是对它们的详细解析:


1. 配置文件的作用

application.yml
  • 作用:
    • 这是项目的 默认配置文件,通常包含通用的基础配置。
    • 它适用于所有环境(如开发、测试、生产等),提供全局的默认值。
application-prod.yml
  • 作用:
    • 这是一个 环境特定的配置文件,用于定义针对某种特定环境(如生产环境)的配置。
    • 文件名中的 prod 表示生产环境(Production),类似的还有 dev(开发环境)、test(测试环境)等。

2. 加载顺序与优先级

Spring Boot 的配置文件加载遵循一定的规则,主要基于 profiles(环境配置)的概念。以下是加载顺序和优先级的详细说明:

加载顺序
  1. application.yml:

    • Spring Boot 会首先加载 application.yml,作为默认的全局配置。
    • 这些配置会被应用于所有环境。
  2. application-{profile}.yml:

    • 如果指定了某个 profile(比如 prod),Spring Boot 会加载对应的配置文件(如 application-prod.yml)。
    • 这些配置会覆盖 application.yml 中相同名称的配置项。
优先级
  • 高优先级覆盖低优先级:
    • 具体来说,application-prod.yml 中的配置会覆盖 application.yml 中的同名配置。
    • 这种机制允许为不同环境定制化配置,而无需修改全局默认配置。

3. 如何指定 Profile

在 Spring Boot 中,可以通过多种方式指定当前使用的 profile:

方式 1: 在 application.yml 中指定
spring:
  profiles:
    active: prod
  • 这里指定了激活的 profile 为 prod,Spring Boot 会加载 application-prod.yml
方式 2: 命令行参数

启动应用时,通过命令行参数指定 profile:

java -jar app.jar --spring.profiles.active=prod
方式 3: 环境变量

设置环境变量来指定 profile:

export SPRING_PROFILES_ACTIVE=prod
方式 4: JVM 参数

通过 JVM 参数指定 profile:

java -Dspring.profiles.active=prod -jar app.jar

4. 示例分析

假设我们有以下两个配置文件:

application.yml
server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/default_db
    username: root
    password: root
application-prod.yml
server:
  port: 8081

spring:
  datasource:
    url: jdbc:mysql://prod-db-host:3306/prod_db
    username: prod_user
    password: prod_password
运行结果
  • 如果没有指定 profile,默认使用 application.yml

    • server.port = 8080
    • 数据库连接信息为 default_db
  • 如果指定了 prod profile(例如通过 --spring.profiles.active=prod):

    • server.port = 8081application-prod.yml 覆盖了 application.yml 的端口配置)。
    • 数据库连接信息为 prod_dbapplication-prod.yml 覆盖了 application.yml 的数据库配置)。

5. 配置文件的合并逻辑

Spring Boot 在加载配置文件时,会将多个配置文件的内容进行合并,具体规则如下:

  1. 基础配置 (application.yml):

    • 先加载 application.yml,作为全局默认配置。
  2. 环境特定配置 (application-{profile}.yml):

    • 根据激活的 profile,加载对应的配置文件。
    • 如果某个配置项在 application-{profile}.yml 中存在,则覆盖 application.yml 中的同名配置项。
  3. 未覆盖的配置项:

    • 如果某个配置项只存在于 application.yml 中,而未在 application-{profile}.yml 中定义,则保留 application.yml 的值。

6. 总结

  • application.yml:

    • 提供全局默认配置,适用于所有环境。
    • 优先级较低,容易被环境特定配置覆盖。
  • application-prod.yml:

    • 提供针对生产环境的特定配置。
    • 优先级较高,会覆盖 application.yml 中的同名配置项。
  • 加载顺序:

    • 先加载 application.yml,再根据激活的 profile 加载对应的 application-{profile}.yml
  • 推荐实践:

    • 将通用配置放在 application.yml 中。
    • 将环境特定的配置放在 application-{profile}.yml 中,避免硬编码敏感信息或环境相关参数。

你可能感兴趣的:(微服务,spring,boot,spring,cloud,java)