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

application.yml 和 bootstrap.yml 由来与作用

核心背景: application.yml 属于 Spring Bootbootstrap.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 环境混淆。
相关推荐
wuminyu1 小时前
JVM锁膨胀与Futex源码解析
java·linux·c语言·jvm·c++
CoderYanger1 小时前
A.每日一题:3622. 判断整除性
java·程序人生·算法·leetcode·面试·职场和发展·蓝桥杯
岁月宁静1 小时前
三、《从零手撸 Agent》 · system prompt 与核心参数:调好你的旋钮
后端·python·agent
吴声子夜歌1 小时前
ApacheCommons——commons-lang3(Java 基础语言增强)(二)
java·开发语言·apache
xcl09251 小时前
幼儿托管系统开发实战:从需求分析到部署上线全指南
java·spring boot·需求分析
步行cgn1 小时前
Spring Boot 中的 YAML 完全指南
android·spring boot·firefox
我不会起名字3221 小时前
一天一道算法题(26):栈的简单应用
java·数据结构·python·算法·leetcode·golang·
bcbnb1 小时前
Flutter-Notebook代码混淆:Android与iOS平台安全配置
后端·ios
凯尔萨厮1 小时前
Java学习笔记十五(GUI)
java·笔记·学习