摘要SpringBoot启动时配置读取发生在Bean创建之前确保依赖配置的Bean能正确初始化。加入Nacos/SpringCloudConfig后流程变为先通过bootstrap.yml获取配置中心地址避免循环依赖再拉取远程配置合并到环境变量Environment最后创建Bean。Nacos简化了架构内置配置管理而SpringCloudConfig需独立GitConfigServer。两者均通过bootstrap阶段类似BIOS引导配置加载核心思想是先定位配置源再构建应用上下文。这一机制是Sentinel、Seata等框架动态配置的基础后续可结合RefreshScope理解动态刷新原理。目录一、普通 Spring Boot 启动流程整体流程配置读取发生在哪里二、现在加入 Nacos Config连接Nacos需要地址。本地启动配置三、Spring Cloud Config流程四、为什么叫 bootstrap五、Spring Boot启动层级六、Nacos Config和Spring Cloud Config插入位置Spring Cloud ConfigNacos Config七、为什么你感觉Nacos简单八、这个知识为什么重要SentinelSeataSkyWalking九、你现在应该记住一个简化版好的我们这一节专门解决你刚才卡住的核心Spring Boot到底什么时候读取配置Nacos Config、Spring Cloud Config到底插入在哪一步你现在不用管 Config 的代码先把启动流程建立起来。一、普通 Spring Boot 启动流程先看你最熟悉的情况。一个普通项目product-service src/main/resources application.yml启动SpringBootApplication public class ProductApplication { public static void main(String[] args){ SpringApplication.run( ProductApplication.class, args ); } }整体流程画成JVM启动 | ↓ main方法执行 | ↓ SpringApplication.run() | ↓ 读取 application.yml | ↓ 创建 Spring 容器 | ↓ 扫描 Bean | ↓ 创建 Controller/Service/Mapper | ↓ 启动 Tomcat | ↓ 服务运行重点配置读取发生在哪里非常早。在创建Bean之前为什么因为创建Bean可能需要配置。例如你的代码Service public class UserService { Value(${jwt.secret}) private String secret; }Spring创建UserService的时候必须知道jwt: secret: abc123在哪里。所以先读配置。再创建对象。二、现在加入 Nacos Config你之前 AIWear其实已经接触类似思想。以前服务 | | application.yml现在服务 | | Nacos | | 配置启动流程变JVM启动 | ↓ main方法 | ↓ 读取基础配置 | ↓ 连接Nacos | ↓ 拉取远程配置 | ↓ 合并配置 | ↓ 创建Spring Bean | ↓ 启动服务注意这里有一个关键连接Nacos需要地址。例如spring: cloud: nacos: config: server-addr: localhost:8848这个配置必须提前知道。所以它不能来自Nacos。否则我要去Nacos拿配置 ↓ 但是不知道Nacos在哪里 ↓ 死循环所以一定存在本地启动配置比如bootstrap.yml里面Nacos地址三、Spring Cloud Config流程现在换成Git Config Server。架构Git | | ↓ Config Server | | ↓ product-service启动product-service启动 | ↓ 读取 bootstrap.yml | ↓ 知道 Config Server地址 | ↓ 访问 Config Server | ↓ Config Server访问Git | ↓ 返回配置 | ↓ 创建Spring Bean | ↓ 启动服务所以bootstrap.yml的角色不是存业务配置。而是告诉Spring配置在哪里。四、为什么叫 bootstrapbootstrap英文启动、引导。它的意思在Spring正式启动之前引导Spring完成准备工作。类似电脑开机第一阶段BIOS启动。第二阶段Windows启动。BIOS不是你的日常系统。但是没有BIOSWindows启动不了。bootstrap类似BIOS。五、Spring Boot启动层级我们画一个更细的。JVM | ↓ SpringApplication | ↓ Environment准备阶段 | ↓ 读取配置文件 | ----------------- | | bootstrap.yml application.yml | ↓ Config/Nacos配置 | ↓ 创建ApplicationContext | ↓ 创建Bean | ↓ Tomcat启动这里Environment是什么简单理解Spring保存配置的地方。比如你的配置server: port:8080 jwt: secret:abc最终都会进入Environment里面。然后Value ConfigurationProperties都是从Environment拿。六、Nacos Config和Spring Cloud Config插入位置对比Spring Cloud Config启动 ↓ bootstrap.yml ↓ Config Server ↓ Git ↓ Environment ↓ BeanNacos Config启动 ↓ bootstrap/application配置 ↓ Nacos Server ↓ Environment ↓ Bean本质一样。区别配置存哪里。七、为什么你感觉Nacos简单因为Nacos把很多事情合并了。例如Spring Cloud ConfigGit Config Server Config Client三个东西。NacosNacos Server 全部包含所以你之前学Nacos配置中心其实已经理解80%。现在只是补充Spring Cloud原生方案。八、这个知识为什么重要因为以后学Sentinel你会看到应用启动 ↓ 加载规则 ↓ 创建保护组件 ↓ 运行也是启动生命周期。Seata也是服务启动 ↓ 连接TC ↓ 注册RM ↓ 参与事务SkyWalking也是JVM启动 ↓ Agent加载 ↓ 增强字节码 ↓ 监控运行所以Spring Boot启动流程是所有框架的基础。九、你现在应该记住一个简化版不用背源码。记Spring Boot启动 1. 找配置 2. 创建环境 3. 创建容器 4. 创建Bean 5. 启动服务 配置中心 插在第1步和第2步之间。对应普通 application.yml Config bootstrap ↓ Config Server ↓ Git Nacos bootstrap/application ↓ Nacos到这里Config的核心思想已经理解。下一步我们可以进入Spring Cloud Config动态刷新也就是修改配置以后为什么服务不用重新打包Spring是怎么重新加载Bean的这个会和你之前学的 NacosRefreshScope联系起来。