bootstrap.yml 先于 application.yml 加载是因为 bootstrapapplicationlistener 在主上下文创建前初始化独立的父级 applicationcontext,专门加载 bootstrap 配置,实现配置中心地址等启动前必需配置的提前注入。

bootstrap.xml 是怎么比 application.yml 先加载的
Spring Cloud 的 bootstrap.xml(或 bootstrap.yml)不是靠“名字更短”或“写在前面”优先加载的,而是由 BootstrapApplicationListener 在 Spring Boot 的上下文刷新前就触发的——它会新建一个独立的、父级的 ApplicationContext,专门用来加载 bootstrap 配置。这个父上下文在主应用上下文(加载 application.yml 的那个)创建之前就已经初始化完毕。
所以不是“顺序读文件”,而是两个上下文层级关系:bootstrap 上下文是 application 上下文的父容器,子容器能继承父容器里的 @ConfigurationProperties、@Value 等绑定结果,但反过来不行。
- 如果你在
bootstrap.yml里配了spring.cloud.config.uri,那它必须在这个早期阶段就可用,否则连远程配置中心都连不上 -
bootstrap.yml里不能用${}引用application.yml里的值(因为后者还没加载),但可以引用系统环境变量或 JVM 参数 - Spring Boot 2.4+ 默认禁用了 bootstrap 模块,必须显式引入
spring-cloud-starter-bootstrap依赖,否则bootstrap.yml会被完全忽略
为什么加了 spring-cloud-starter-bootstrap 还不生效
常见现象是改了 bootstrap.yml,启动日志里却看不到 Config Server 请求,或者 @Value("${my.service.name}") 报错找不到配置——大概率是 bootstrap 上下文压根没起来。
云模块_YunMOK网站管理系统采用PHP+MYSQL为编程语言,搭载自主研发的模块化引擎驱动技术,实现可视化拖拽无技术创建并管理网站!如你所想,无限可能,支持创建任何网站:企业、商城、O2O、门户、论坛、人才等一块儿搞定!永久免费授权,包括商业用途; 默认内置三套免费模板。PC网站+手机网站+适配微信+文章管理+产品管理+SEO优化+组件扩展+NEW Login界面.....目测已经遥遥领先..
- 检查是否真的引入了
spring-cloud-starter-bootstrap(注意不是spring-cloud-starter-config,后者只负责运行时刷新,不触发 bootstrap 阶段) - 确认
spring.cloud.bootstrap.enabled=true(Spring Boot 2.4+ 默认为false,必须显式打开) - IDE 启动时如果用了 “Enable annotation processing”,某些 Lombok 或 mapstruct 插件可能干扰类路径扫描,导致
BootstrapApplicationListener未注册 - 打包成 jar 后启动,要确认
BOOT-INF/classes/bootstrap.yml确实存在且路径正确;Maven 资源过滤如果误删了该文件,也会静默失效
bootstrap.yml 和 application.yml 的配置项冲突怎么办
不是所有配置都能在 bootstrap 阶段用。比如 server.port、logging.level 这类属于 Spring Boot 自身生命周期控制的配置,写在 bootstrap.yml 里会被忽略(启动日志会警告 “Ignoring property”)。
- 只应在
bootstrap.yml放真正需要“启动前就确定”的配置:如spring.application.name、spring.cloud.config.*、encrypt.*、eureka.client.service-url.defaultZone -
spring.profiles.active写在bootstrap.yml中会影响整个 bootstrap 上下文的 profile,进而影响它从哪加载远程配置;但如果同时在application.yml里也写了,后者不会覆盖前者——因为 profile 在父上下文已锁定 - 加密配置(如
{cipher}xxx)必须在 bootstrap 阶段解密,否则 application 阶段看到的就是明文字符串,解密逻辑根本不会触发
Spring Boot 3.x + Spring Cloud 2023.x 还支持 bootstrap 吗
支持,但机制变了。Spring Cloud 2023.0(即 Spring Cloud with Spring Boot 3.2+)不再依赖 spring-cloud-starter-bootstrap,而是把 bootstrap 行为合并进了 spring-cloud-starter 的自动配置中,只要 classpath 里有 spring-cloud-context 就默认启用。
- 不需要再手动加
spring-cloud-starter-bootstrap,但spring.cloud.bootstrap.enabled依然要设为true(除非你明确想关掉) -
bootstrap.yml文件名仍然有效,但官方推荐统一用application.yml+spring.config.import=optional:configserver:替代,这样更符合 Spring Boot 2.4+ 的配置加载模型 - 如果你还在用旧方式,要注意
BootstrapContext现在是ConfigurableBootstrapContext,部分监听器签名有变化,自定义PropertySourceLocator时需适配接口
真正容易被忽略的是:哪怕用了新 import 方式,像 Nacos 或 Apollo 的 auto-refresh 仍依赖早期上下文隔离机制,直接删掉 bootstrap 阶段可能导致配置变更无法及时推送到 Bean 初始化过程。









