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 环境混淆。
相关推荐
程序猿DD43 分钟前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
蛋蛋的就会顺顺的3 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
余槐i3 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8264 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡4 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
凤山老林5 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne6 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF6 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
silvamux_6 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
pride.li6 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉