Spring Boot 启动流程源码解析 🚀
Spring Boot 启动流程源码解析 🚀
一、为什么要研究 Spring Boot 的启动流程?🤔
虽然日常开发中,我们只需一行 SpringApplication.run(...)
即可完成项目启动,但在以下场景中理解底层启动流程至关重要:
自定义自动配置或构建 Starter 时,无法判断配置生效机制;
出现 Bean 无法注入、配置未加载等问题时,排查无从下手;
需要监听项目启动状态(如初始化缓存、注册服务等)时,事件机制掌握不清;
面试中常被问到:Spring Boot 是怎么实现自动装配的?
所以,理解 Spring Boot 的启动过程,既是工程实践的基础,也是进阶高级开发的必经之路。
二、启动入口:SpringApplication.run() 🌱
最基础的启动类如下:
1 |
|
注解结构解析
@SpringBootApplication
=@Configuration
+@EnableAutoConfiguration
+@ComponentScan
自动扫描、注册配置类、开启自动装配,全部集成在这一个注解中
核心类:SpringApplication
在调用 run()
前,Spring Boot 会先构建一个 SpringApplication
对象:
1 |
|
这里完成了应用类型推断、初始化器和监听器的加载,核心机制都围绕 spring.factories
文件展开。
三、Spring Boot 启动流程总览 🛠️
启动过程主要分为以下几个阶段:
graph TD
A[创建 SpringApplication 实例] --> B[推断 Web 应用类型]
B --> C[加载初始化器 ApplicationContextInitializer]
C --> D[加载监听器 ApplicationListener]
D --> E[推断主类 Main Class]
E --> F[prepareEnvironment 创建并配置环境]
F --> G[创建 ApplicationContext]
G --> H[应用初始化器 applyInitializers]
H --> I[加载 BeanDefinition]
I --> J[刷新上下文 refreshContext]
J --> K[收尾操作 afterRefresh]
K --> L[发布 ApplicationStartedEvent]
L --> M[发布 ApplicationReadyEvent]
M --> N[启动完成]
关键事件发布顺序如下:
ApplicationStartingEvent
ApplicationEnvironmentPreparedEvent
ApplicationContextInitializedEvent
ApplicationPreparedEvent
ApplicationStartedEvent
ApplicationReadyEvent
四、重点源码解读 🔍
1️⃣ run()
方法调用链
1 |
|
2️⃣ 自动装配机制:@EnableAutoConfiguration
核心原理是加载 META-INF/spring.factories
中声明的自动配置类
使用了 SpringFactoriesLoader.loadFactoryNames(...)
配合 @ConditionalOnClass
、@ConditionalOnMissingBean
等条件注解动态判断配置是否生效
例如:
1 |
|
五、监听器与事件机制 🧩
Spring Boot 的事件驱动模型贯穿启动全过程,通过 ApplicationListener
可以接入每一个关键节点。例如:
1 |
|
注册方式:
1 |
|