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

embedded/2025/3/15 2:44:08/

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

http://www.ppmy.cn/embedded/172647.html

相关文章

STM32之I2C硬件外设

注意:硬件I2C的引脚是固定的 SDA和SCL都是复用到外部引脚。 SDA发送时数据寄存器的数据在数据移位寄存器空闲的状态下进入数据移位寄存器,此时会置状态寄存器的TXE为1,表示发送寄存器为空,然后往数据控制寄存器中一位一位的移送数…

linux centos 忘记root密码拯救

在CentOS 7中,如果忘记root密码,可以通过修改系统启动参数进入单用户模式或紧急模式进行重置。以下是两种常用方法,适用于物理机或虚拟机环境: 方法一:通过rd.break参数重置密码 步骤: 重启系统并进入GRU…

Yashan DB 应用开发

一、YashanDB支持的驱动 YashanDB支持多种驱动,包括JDBC、C、Python、ADO.NET、ODBC等。以下是详细介绍: 1.JDBC驱动 • 定义:JDBC是Java连接数据库的技术统称。Java语言只提供规范(接口),规定数据库操作…

益百分用科技与艾文化深度融合重新定义艾草产业

益百分用科技与艾文化深度融合重新定义艾草产业 益百分是一家致力于用科技赋能艾文化的企业,专注于将现代科技与传统艾草文化相结合,推动艾草产业的创新与发展。通过科技手段,益百分旨在提升艾草产品的品质、生产效率以及用户体验&#xff0…

查询MySQL表占用磁盘大小的方法

最近有个需求需要查询MySQL表所占的体积(磁盘空间)大小,有几个方法记录一下: 1. 使用 INFORMATION_SCHEMA 数据库 这是最常用的方法,可以查询单个表或整个数据库的大小: -- 查询特定表的大小 SELECT table_name AS 表名,ROUND(data_length/1024/1024,…

解决Windows版Redis无法远程连接的问题

🌟 解决Windows版Redis无法远程连接的问题 在Windows系统下使用Redis时,很多用户会遇到无法远程连接的问题。尤其是在配置了Redis并尝试通过工具如RedisDesktopManager连接时,可能会报错“Cannot connect to ‘redisconnection’”。今天&am…

自动化测试框架学习总结

视频:hytest - 测试自动化框架_哔哩哔哩_bilibili 资料:hytest 框架 - 白月黑羽 hytest 简介 hytest (黑羽test)是白月黑羽自己研发的自动化测试框架,它非常适合 做 系统测试 自动化, 而相比之下&#x…

【hot100】实现Trie(前缀树)

一、思路 这题的思路很简单,其实就是一个26叉树,但是这个数不同通过通常的左右节点属性,而是一个数组来存储的,每个数组下标存储下层的数组。其中有以下需要注意的点: 1.private Trie[] children; 这个说明孩子节点是…