application.yml
和 bootstrap.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.name
和spring.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.uri
或spring.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 监听器或初始化器需要的配置。
- 配置 Spring Cloud Config Client 或 Nacos Config Client: 例如
application.yml
/application.properties
: 应用程序通用配置:- 应用程序自身的通用配置: 例如,端口号、数据源连接信息 (如果不是共享的)、日志级别、国际化配置、Thymeleaf 模板配置、Spring MVC 配置、Bean 的定义等。
- 业务逻辑相关的配置: 例如,一些业务开关、参数配置等。
- 大部分应用程序的配置都应该放在
application.yml
中。
3. 上下文 (Context):
bootstrap.yml
/bootstrap.properties
: Bootstrap Contextapplication.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.name
和spring.profiles.active
。 - 配置需要在 Bootstrap Context 中使用的属性。
application.yml
/application.properties
: 适用于:- 配置应用程序的通用设置。
- 定义 Bean。
- 配置业务逻辑相关的参数。
- 大部分应用程序的配置。
7. 配置覆盖 (Configuration Overriding):
application.yml
中的配置会覆盖bootstrap.yml
中相同属性的配置。 这是因为application.yml
在bootstrap.yml
之后加载。- 命令行参数、环境变量等 可以进一步覆盖
application.yml
和bootstrap.yml
中的配置。 Spring Boot 的配置优先级顺序是:- 命令行参数
- 环境变量
application.yml
/application.properties
(profile-specific 和 default)bootstrap.yml
/bootstrap.properties
(profile-specific 和 default)- 默认配置 (Spring Boot 框架内部的默认值)
8. 默认位置 (Default Location):
application.yml
和bootstrap.yml
的默认位置都是src/main/resources/
目录下。
9. 是否必须存在 (Required or Optional):
application.yml
和bootstrap.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
配置自身应用。