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

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

核心区别概览:

特性 bootstrap.yml / bootstrap.properties application.yml / application.properties
加载时机 更早 (Bootstrap Context) 较晚 (Application Context)
用途 引导引导 (Bootstrapping), 外部化配置 应用程序通用配置
上下文 Bootstrap Context Application 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 配置自身应用。
相关推荐
小杨4041 小时前
springboot框架项目实践应用七(validation分组、嵌套校验)
spring boot·后端·架构
李长渊哦2 小时前
引入其他 YML 配置源 —— Spring Boot 中的 `import` 功能
数据库·spring boot·后端
高建伟-joe2 小时前
Spring Boot Tomcat 漏洞修复
java·spring boot·后端·网络安全·tomcat
小钊(求职中)2 小时前
RabbitMQ从入门到实战-知识详情总结
java·服务器·spring boot·分布式·spring·面试·rabbitmq
程序员小刚3 小时前
基于springboot + vue 的实验室(预约)管理系统
vue.js·spring boot·后端
程序员小刚3 小时前
基于SpringBoot + Vue 的校园论坛系统
vue.js·spring boot·后端
计算机学长felix3 小时前
基于SpringBoot的“校园周边美食探索及分享平台”的设计与实现(源码+数据库+文档+PPT)
spring boot·毕业设计
xcbeyond4 小时前
Redis Sentinel 及 Redisson 连接问题全解析
redis·bootstrap·sentinel
陈奕璇6 小时前
基于SpringBoot+Vue的瑜伽课体验课预约系统【附源码】
vue.js·spring boot·后端