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 配置自身应用。

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

相关文章

  • spring定义和装配bean详解

    spring定义和装配bean详解

    这篇文章主要介绍了spring定义和装配bean详解,具有一定参考价值,需要的朋友可以了解下。
    2017-12-12
  • JAVAWEB实现简单的商城项目(一)实例代码解析

    JAVAWEB实现简单的商城项目(一)实例代码解析

    本文给大家分享一段实例代码给大家介绍JAVAWEB实现简单的商城项目(一),非常具有参考价值,感兴趣的朋友一起学习吧
    2016-02-02
  • SpringBoot2入门自动配置原理及源码分析

    SpringBoot2入门自动配置原理及源码分析

    这篇文章主要为大家介绍了SpringBoot2入门自动配置原理及源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 详解解密Java中的类型转换问题

    详解解密Java中的类型转换问题

    这篇文章主要介绍了Java中的类型转换问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Java中PrintWriter使用方法介绍

    Java中PrintWriter使用方法介绍

    这篇文章主要介绍了Java中PrintWriter使用方法介绍,文章围绕主题展开PrintWriter使用方法的详细介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-06-06
  • Java中几个Reference常见的作用详解

    Java中几个Reference常见的作用详解

    这篇文章主要给大家介绍了Java中关于Reference多个作用的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-06-06
  • 从dubbo zookeeper注册地址提取出zookeeper地址的方法

    从dubbo zookeeper注册地址提取出zookeeper地址的方法

    今天小编就为大家分享一篇关于从dubbo zookeeper注册地址提取出zookeeper地址的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 详解java整合solr5.0之solrj的使用

    详解java整合solr5.0之solrj的使用

    本篇文章主要介绍了详解java整合solr5.0之solrj的使用 ,具有一定的参考价值,有兴趣的可以了解下
    2017-06-06
  • 一文搞懂Java创建线程的五种方法

    一文搞懂Java创建线程的五种方法

    本文主要为大家详细介绍一下Java实现线程创建的五种常见方式,文中的示例代码讲解详细,对我们学习有一定的帮助,感兴趣的可以跟随小编学习一下
    2022-06-06
  • Java中包装类和Arrays类的详细介绍

    Java中包装类和Arrays类的详细介绍

    Arrays针对于数组做操作的类,该类包含用于操作数组的各种方法(如排序和搜索),这篇文章主要给大家介绍了关于Java中包装类和Arrays类的详细介绍,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12

最新评论