application.yml 和 bootstrap.yml 由来与作用
核心背景:
application.yml属于 Spring Boot ;bootstrap.yml属于 Spring Cloud,不是 Spring Boot 原生支持。
1、application.yml(Spring Boot 原生)
由来
Spring Boot 设计的业务应用主配置文件,Spring Boot 启动时自动加载,支持 yml /yaml/properties 格式。
- 加载时机:Spring Boot 的
ApplicationContext(业务上下文)创建阶段加载。 - 位置优先级:
file:./config/>file:./>classpath:/config/>classpath:/
作用
- 普通业务配置:端口、数据库、mybatis、redis、日志、自定义业务参数。
- 激活环境:
spring.profiles.active=dev - 绝大多数日常开发配置都写这里。
- 不能读取远程配置中心配置(Nacos/Apollo/Consul 等)。
简单记:应用运行时的配置。
2、bootstrap.yml(Spring Cloud 引入)
由来
Spring Cloud 为了适配配置中心,新增一套「引导上下文」机制。
⚠️ Spring Boot 本身不识别 bootstrap.yml! 需要引入依赖才生效:
<!-- spring cloud 2020.0.x(Ilford)及以后,必须手动引入bootstrap依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
没有这个依赖,bootstrap.yml 文件直接被忽略,不会加载。
加载时机
bootstrap 上下文优先于 application 上下文创建,更早执行。
bootstrap引导上下文 → 2.application应用上下文 bootstrap 上下文是父上下文,application 是子上下文;子可以继承父的配置。
作用
专门放启动前置配置:
-
配置中心地址(Nacos、Apollo、Spring Cloud Config 的服务地址)
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
程序启动第一步就要知道去哪里拉远程配置,这部分必须写 bootstrap,写 application 里会读取不到远程配置。
- 应用名称
spring.application.name(注册到注册中心的服务名) - 加密密钥、一些云环境底层启动参数。
简单记:程序还没完全跑起来之前,需要读取的配置,放 bootstrap.yml。
3、两者核心对比
表格
| 对比项 | bootstrap.yml | application.yml |
|---|---|---|
| 归属 | Spring Cloud(需要额外依赖) | Spring Boot 原生 |
| 加载顺序 | 更早(引导上下文) | 晚于 bootstrap |
| 主要用途 | 配置中心地址、服务名、启动前置参数 | 业务、数据库、端口等业务配置 |
| 能否读取远程配置 | ✅可以 | ❌不行 |
| 配置优先级 | bootstrap > application | 低于 bootstrap |
优先级说明:相同 key,bootstrap 里面的值会覆盖 application。
4、常见坑点
- Spring Cloud 2020.0.0 之后默认关闭 bootstrap 支持 ,不加
spring-cloud-starter-bootstrap,bootstrap.yml 完全失效,很多人踩坑。 - 不要把数据库、业务参数写到 bootstrap,它只放 "怎么去拿配置" 的信息,业务配置放到配置中心或者 application。
- 如果同时存在,两个文件都会加载;bootstrap 先加载。
bootstrap.yml也支持bootstrap-dev.yml多环境。
5、版本小历史
- Spring Cloud Hoxton 及更早:默认开启 bootstrap,不用额外依赖。
- Spring Cloud Ilford(2020.0.x):做了大改动,默认禁用 bootstrap,必须手动引入 starter。
- 新版本 Nacos/Apollo 也支持在 application 里通过新方式指定配置中心,但行业主流习惯依然把连接配置放在 bootstrap。
通俗一句话总结
高频踩坑
补充:新版本不使用 bootstrap.yml 的写法
Spring Cloud Alibaba 新版本支持直接在 application.yml 指定 nacos,不再需要 bootstrap.yml,但早期项目还是大量沿用 bootstrap 方案
# application.yml 替代bootstrap,不需要bootstrap starter
spring:
cloud:
nacos:
config:
import: nacos:demo-service-dev.yml?serverAddr=127.0.0.1:8848&namespace=dev
这种
spring.cloud.nacos.import是新方案,推荐新项目可以采用,去掉 bootstrap.yml。
- bootstrap.yml:告诉程序去哪里找配置(配置中心地址,启动要用)
- application.yml:程序真正跑起来要用的业务配置
最简 Nacos 示例
1、pom.xml 关键依赖(Spring Cloud 2020+ 必须加 bootstrap starter)
<!-- spring cloud bootstrap 支持,没有这个 bootstrap.yml 不生效 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!-- nacos config 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- nacos discovery 注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2、bootstrap.yml 【引导文件:只放连接配置中心 / 注册中心的元信息】
作用:项目启动最先加载,拿着这里的地址去 Nacos 拉取远程配置
spring:
application:
name: demo-service # 服务名,nacos配置dataId默认就是 demo-service.yml
cloud:
nacos:
# 配置中心
config:
server-addr: 127.0.0.1:8848
file-extension: yml
namespace: dev # 命名空间
# 注册中心
discovery:
server-addr: 127.0.0.1:8848
namespace: dev
✅ bootstrap 职责:告诉程序 Nacos 在哪、服务叫什么、哪个命名空间。 ❌不要写数据库、redis、业务开关在这里。
3、application.yml 【业务配置:本地兜底、端口、日志、激活环境】
server:
port: 8081
spring:
profiles:
active: dev
# 本地兜底配置,如果nacos远程配置不存在,就用本地这一份
datasource:
url: jdbc:mysql://127.0.0.1:3306/test
username: root
password: 123456
# 自定义业务参数
biz:
order:
timeout: 3000
4、Nacos 配置中心页面上的远程配置 dataId:demo-service-dev.yml
# nacos远程配置,会覆盖本地application.yml相同key
datasource:
url: jdbc:mysql://192.168.1.100:3306/test_prod
username: prod_root
password: prod@123456
biz:
order:
timeout: 5000
完整加载流程
- 启动 → 加载 bootstrap.yml,拿到 nacos 地址、服务名、namespace
- 使用 bootstrap 中的参数,访问 Nacos 服务端拉取远程配置 demo‑service‑dev.yml
- 加载本地 application.yml
- 配置合并优先级(高→低):
Nacos远程配置 > bootstrap.yml > application.yml - 忘记引入
spring-cloud-starter-bootstrap→ bootstrap.yml 完全不读取,nacos 连不上。 - 把
spring.cloud.nacos.config.server‑addr写到 application.yml:启动阶段读不到这个地址,无法拉远程配置。 - spring.application.name 写错:nacos 找不到对应的 dataId。
- namespace 写错,dev/prod 环境混淆。