一、SpringBoot 启动核心流程总结
- 入口:
SpringApplication.run() - 构造
SpringApplication - 通过
SpringApplicationRunListeners发布启动事件 - 准备
Environment(加载配置、yml/properties) - 创建
ApplicationContext容器 - 核心:refresh() 容器(扫描、注册Bean、实例化、启动Web服务器)
- 发布
ApplicationStartedEvent - 执行
ApplicationRunner/CommandLineRunner - 发布
ApplicationReadyEvent,启动完成
二、Mermaid 流程图(可直接复制渲染)
三、逐阶段源码级讲解
1. 入口 run()
publicstaticConfigurableApplicationContextrun(Class<?>primarySource,String...args){returnnewSpringApplication(primarySource).run(args);}2. 构造 SpringApplication
- 推断 Web 应用类型
- 从
META-INF/spring.factories加载:ApplicationContextInitializerApplicationListener
3. SpringApplicationRunListeners 事件调度
这是启动“ lifecycle 管家”,依次发布:
ApplicationStartingEventApplicationEnvironmentPreparedEventApplicationPreparedEventApplicationStartedEventApplicationReadyEvent
4. Environment 准备
加载:
- 系统变量
- 命令行参数
application.yml/application.properties- 激活 profile
5. 创建 ApplicationContext
- Web 应用:
AnnotationConfigServletWebServerApplicationContext - 非 Web:
AnnotationConfigApplicationContext
6.核心:refresh()(最重要)
@Overridepublicvoidrefresh()throwsBeansException,IllegalStateException{super.refresh();}内部关键步骤:
- 扫描包、解析 BeanDefinition
- 实例化单例 Bean
- 执行
onRefresh()→ 启动 Tomcat/Undertow - 完成 IoC 初始化
7. 启动完成
- 执行 Runner
- 发布 Ready 事件
- 服务可以对外提供访问
四、SpringApplicationRunListeners 与事件关系
五、面试满分一句话总结
SpringBoot 启动就是:
通过 SpringApplication 准备环境、创建容器、利用 SpringApplicationRunListeners 在生命周期各阶段发布事件,最终通过 refresh() 完成 IoC 初始化并启动 Web 服务器,最后执行 Runner 并发布就绪事件。