目录

Spring-Boot-项目中application.yml-和-bootstrap.yml-文件的区别

目录

Spring Boot 项目中application.yml 和 bootstrap.yml 文件的区别

application.ymlbootstrap.yml 文件都是 Spring Boot 项目中用于配置应用程序的 YAML 或 Properties 文件,但它们在 加载顺序、用途和优先级 上存在关键的区别。

核心区别概览:

特性bootstrap.yml / bootstrap.propertiesapplication.yml / application.properties
加载时机更早 (Bootstrap Context)较晚 (Application Context)
用途引导引导 (Bootstrapping) , 外部化配置应用程序通用配置
上下文Bootstrap ContextApplication Context
优先级更高 (在 Bootstrap Context 中)较低 (在 Application Context 中)
配置来源外部配置 (Config Server, Nacos, etc.)应用自身配置 (本地文件, 命令行, 环境变量)
适用场景配置中心连接、共享配置、应用名、Profile应用通用配置、Bean 定义、业务逻辑配置
配置覆盖application.yml 覆盖 bootstrap.yml命令行参数、环境变量等覆盖 application.yml
默认位置src/main/resources/src/main/resources/
是否必须存在可选可选 (但通常存在)

详细解释和区别:

1. 加载时机 (Loading Order):

  • bootstrap.yml / bootstrap.properties (Bootstrap Context): 在 Spring Boot 应用程序启动的 非常早期 阶段加载。 这是通过 Bootstrap Context 实现的,它是一个特殊的父级 Spring 上下文,在主 Application Context 之前创建。
  • application.yml / application.properties (Application Context):bootstrap.yml 加载之后, 在 Application Context 初始化时 加载。 这是 Spring Boot 应用的主上下文。

理解 Bootstrap Context 和 Application Context:

你可以将 Bootstrap Context 理解为 Spring Boot 启动的 引导阶段 ,它负责初始化一些 基础且关键 的配置,例如:

  • 配置 Spring Cloud Config Client 或 Nacos Config Client 的连接信息: Bootstrap Context 需要先知道如何连接配置中心,才能加载外部化配置。
  • 加载共享配置: 在多个应用之间共享的配置通常需要在 Bootstrap Context 中加载,以便在应用启动的早期阶段就可用。
  • 设置 spring.application.namespring.profiles.active 等基础属性: 这些属性通常需要在 Bootstrap Context 中确定,以便后续的配置加载和应用初始化能够正确进行。

Application Context 则是 Spring Boot 应用的 主应用上下文 ,负责加载和管理应用程序中的所有 Bean、处理请求、执行业务逻辑等。 application.yml 主要用于配置应用程序自身的通用设置。

2. 用途 (Purpose):

  • **bootstrap.yml
    /
    bootstrap.properties
    引导引导 (Bootstrapping) 和 外部化配置:**
    • 配置 Spring Cloud Config Client 或 Nacos Config Client: 例如 spring.cloud.config.urispring.cloud.nacos.config.server-addr 等配置。
    • 加载共享配置 ( sharedConfigs ): 使用 Spring Cloud Alibaba Nacos Config 的 sharedConfigs 功能时,需要在 bootstrap.yml 中配置。
    • 配置应用程序名称 ( spring.application.name ): 通常在 bootstrap.yml 中设置,用于标识应用,方便配置中心识别。
    • 激活 Profile ( spring.profiles.active ):bootstrap.yml 中激活 Profile,可以影响后续的配置加载。
    • 其他需要在应用启动早期就加载的配置: 例如,一些自定义的 Bootstrap 监听器或初始化器需要的配置。
  • **application.yml
    /
    application.properties
    应用程序通用配置:**
    • 应用程序自身的通用配置: 例如,端口号、数据源连接信息 (如果不是共享的)、日志级别、国际化配置、Thymeleaf 模板配置、Spring MVC 配置、Bean 的定义等。
    • 业务逻辑相关的配置: 例如,一些业务开关、参数配置等。
    • 大部分应用程序的配置都应该放在 application.yml 中。

3. 上下文 (Context):

  • **bootstrap.yml
    /
    bootstrap.properties
    Bootstrap Context**
  • **application.yml
    /
    application.properties
    Application Context**

这意味着 bootstrap.yml 中的配置主要作用于 Bootstrap Context,而 application.yml 中的配置作用于 Application Context。 Bootstrap Context 的配置会影响 Application Context 的创建和初始化。

4. 优先级 (Priority):

  • bootstrap.yml / bootstrap.properties 的优先级更高 (在 Bootstrap Context 中): Bootstrap Context 的配置会优先加载,并影响 Application Context 的创建。
  • application.yml / application.properties 的优先级较低 (在 Application Context 中): Application Context 的配置在 Bootstrap Context 之后加载。

5. 配置来源 (Configuration Sources):

  • **bootstrap.yml
    /
    bootstrap.properties
    倾向于配置** 外部配置来源**,例如 Spring Cloud Config Server, Nacos Config Server 等。 也用于配置一些需要在引导阶段就确定的 基础属性
  • **application.yml
    /
    application.properties
    主要用于配置** 应用自身**的配置,通常来源于本地文件系统、命令行参数、环境变量等。

6. 适用场景 (Use Cases):

  • **bootstrap.yml
    /
    bootstrap.properties
    适用于:**
    • 配置 Spring Cloud Config 或 Nacos Config Client 连接信息。
    • 配置 sharedConfigs (Nacos Config)。
    • 设置 spring.application.namespring.profiles.active
    • 配置需要在 Bootstrap Context 中使用的属性。
  • **application.yml
    /
    application.properties
    适用于:**
    • 配置应用程序的通用设置。
    • 定义 Bean。
    • 配置业务逻辑相关的参数。
    • 大部分应用程序的配置。

7. 配置覆盖 (Configuration Overriding):

  • application.yml 中的配置会覆盖 bootstrap.yml 相同属性的配置。 这是因为 application.ymlbootstrap.yml 之后加载。
  • 命令行参数、环境变量等 可以进一步覆盖 application.ymlbootstrap.yml 中的配置。 Spring Boot 的配置优先级顺序是:
    1. 命令行参数
    2. 环境变量
    3. application.yml / application.properties (profile-specific 和 default)
    4. bootstrap.yml / bootstrap.properties (profile-specific 和 default)
    5. 默认配置 (Spring Boot 框架内部的默认值)

8. 默认位置 (Default Location):

  • application.ymlbootstrap.yml 的默认位置都是 src/main/resources/ 目录下。

9. 是否必须存在 (Required or Optional):

  • application.ymlbootstrap.yml 都不是 必须 存在的。 Spring Boot 应用在没有这些配置文件的情况下也可以启动,它会使用默认配置。
  • 然而,在实际开发中,为了进行各种自定义配置, application.yml (或 application.properties ) 通常是 必需 存在的。 bootstrap.yml (或 bootstrap.properties ) 则在需要使用 Spring Cloud Config 或 Nacos Config 等外部化配置管理时才 常用

总结:

  • 如果你不需要使用 Spring Cloud Config 或 Nacos Config 等外部化配置管理,那么你可能只需要 application.yml (或 application.properties ) 文件。 大部分应用程序的配置都放在 application.yml 中即可。
  • 如果你需要使用 Spring Cloud Config 或 Nacos Config 等外部化配置管理,或者需要在应用启动的早期阶段加载一些关键配置 (例如共享配置、应用名、Profile 等),那么你就需要使用 bootstrap.yml (或 bootstrap.properties ) 文件。 bootstrap.yml 主要用于配置引导阶段的配置,以及外部化配置的连接信息和共享配置。

简单记忆口诀:

  • Bootstrap 先行,Application 后续: bootstrap.yml 先加载, application.yml 后加载。
  • Bootstrap 引导,Application 应用: bootstrap.yml 负责引导启动, application.yml 负责应用配置。
  • Bootstrap 外部,Application 自身: bootstrap.yml 配置外部配置, application.yml 配置自身应用。