SpringBoot项目中application.yml和bootstrap.yml文件的区别及说明

 更新时间:2025年03月11日 10:53:02   作者:冰糖心书房  
`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 配置自身应用。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java基于IO流读取文件的方法

    Java基于IO流读取文件的方法

    这篇文章主要介绍了Java基于IO流读取文件的方法,涉及Java文件流操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Idea2022版本配置SpringBoot热部署的教程

    Idea2022版本配置SpringBoot热部署的教程

    这篇文章主要介绍了Idea2022版本配置SpringBoot热部署的教程,包括添加依赖及更改IDEA设置的方法,本文图文实例相结合给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Java 关于String字符串原理上的问题

    Java 关于String字符串原理上的问题

    字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串,让我们一起来了解它
    2022-04-04
  • Java中五种不同方法的创建对象

    Java中五种不同方法的创建对象

    本文为大家详细介绍了在Java中5种不同创建对象的方法和实例代码,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • SpringBoot集成Curator实现Zookeeper基本操作的代码示例

    SpringBoot集成Curator实现Zookeeper基本操作的代码示例

    Zookeeper是一个Apache开源的分布式的应用,为系统架构提供协调服务,ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户,本文给大家介绍了SpringBoot集成Curator实现Zookeeper基本操作,需要的朋友可以参考下
    2024-05-05
  • mybatis的Configuration详解

    mybatis的Configuration详解

    这篇文章主要介绍了mybatis的Configuration详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • eclipse导入工程报错问题项目或者文件有红叉的解决方案

    eclipse导入工程报错问题项目或者文件有红叉的解决方案

    这篇文章主要介绍了eclipse导入工程报错问题项目或者文件有红叉的解决方案,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Java 数据库时间返回前端显示错误(差8个小时)的解决方法

    Java 数据库时间返回前端显示错误(差8个小时)的解决方法

    本文主要介绍了Java 数据库时间返回前端显示错误(差8个小时)的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • Java实现在线聊天室(层层递进)

    Java实现在线聊天室(层层递进)

    这篇文章主要为大家详细介绍了Java实现在线聊天室,层层递进,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Java实现Floyd算法的示例代码

    Java实现Floyd算法的示例代码

    Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法。本文将用Java语言实现Floyd算法,需要的可以参考一下
    2022-07-07

最新评论