Springboot 的 配置文件 application.yml 和 bootrap.yml 的由来和作用

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:/

作用

  1. 普通业务配置:端口、数据库、mybatis、redis、日志、自定义业务参数。
  2. 激活环境:spring.profiles.active=dev
  3. 绝大多数日常开发配置都写这里。
  4. 不能读取远程配置中心配置(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 上下文创建,更早执行。

  1. bootstrap 引导上下文 → 2. application 应用上下文 bootstrap 上下文是父上下文,application 是子上下文;子可以继承父的配置。

作用

专门放启动前置配置:

  1. 配置中心地址(Nacos、Apollo、Spring Cloud Config 的服务地址)

    spring:
    cloud:
    nacos:
    config:
    server-addr: 127.0.0.1:8848

程序启动第一步就要知道去哪里拉远程配置,这部分必须写 bootstrap,写 application 里会读取不到远程配置。

  1. 应用名称 spring.application.name(注册到注册中心的服务名)
  2. 加密密钥、一些云环境底层启动参数。

简单记:程序还没完全跑起来之前,需要读取的配置,放 bootstrap.yml。


3、两者核心对比

表格

对比项 bootstrap.yml application.yml
归属 Spring Cloud(需要额外依赖) Spring Boot 原生
加载顺序 更早(引导上下文) 晚于 bootstrap
主要用途 配置中心地址、服务名、启动前置参数 业务、数据库、端口等业务配置
能否读取远程配置 ✅可以 ❌不行
配置优先级 bootstrap > application 低于 bootstrap

优先级说明:相同 key,bootstrap 里面的值会覆盖 application。

4、常见坑点

  1. Spring Cloud 2020.0.0 之后默认关闭 bootstrap 支持 ,不加 spring-cloud-starter-bootstrap,bootstrap.yml 完全失效,很多人踩坑。
  2. 不要把数据库、业务参数写到 bootstrap,它只放 "怎么去拿配置" 的信息,业务配置放到配置中心或者 application。
  3. 如果同时存在,两个文件都会加载;bootstrap 先加载。
  4. bootstrap.yml 也支持 bootstrap-dev.yml 多环境。

5、版本小历史

  1. Spring Cloud Hoxton 及更早:默认开启 bootstrap,不用额外依赖。
  2. Spring Cloud Ilford(2020.0.x):做了大改动,默认禁用 bootstrap,必须手动引入 starter。
  3. 新版本 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 环境混淆。
相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
小羊没烦恼!3 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
俊昭喜喜里3 天前
java中的继承和多态的区别
java
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
譕痕3 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖3 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时3 天前
01-06-A-JVM排查实战详解
java·jvm