SpringBoot的启动流程
好的 👍,我来给你梳理一下 Spring Boot 启动流程,从 main 方法开始到整个容器完成启动的核心过程。
1. 启动入口
典型的 Spring Boot 应用入口:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
SpringApplication.run(...) 是启动的核心。
2. 启动流程大图(简化版)
main() →
SpringApplication.run() →
① 构建 SpringApplication 对象
② 执行 run()
├─ 准备阶段(环境 Environment)
├─ 创建并准备容器(ApplicationContext)
├─ 刷新容器(refresh)
├─ 执行所有 runners(CommandLineRunner / ApplicationRunner)
└─ 完成启动
3. 详细流程
第一阶段:创建 SpringApplication
-
new SpringApplication(...) -
主要工作:
- 确定应用类型(
SERVLET、REACTIVE、NONE) - 加载
ApplicationContextInitializer(上下文初始化器) - 加载
ApplicationListener(事件监听器) - 推断主类(通过
main方法所在的类)
- 确定应用类型(
第二阶段:执行 run()
核心逻辑在 SpringApplication#run 方法里。
(1) 启动计时器
- 用
StopWatch记录启动耗时
(2) 启动监听器(SpringApplicationRunListeners)
- 发布事件
ApplicationStartingEvent,通知监听器:应用启动了
(3) 创建/配置 Environment(环境)
- 负责加载配置源(系统属性、环境变量、
application.properties/yml等) - 发布
ApplicationEnvironmentPreparedEvent事件
(4) 打印 Banner
- 如果
resources/banner.txt存在,打印启动 Banner
第三阶段:创建并准备容器
(1) 创建 ApplicationContext
-
根据应用类型,创建对应容器:
- Web 应用 →
AnnotationConfigServletWebServerApplicationContext - Reactive 应用 →
AnnotationConfigReactiveWebServerApplicationContext - 非 Web →
AnnotationConfigApplicationContext
- Web 应用 →
(2) 初始化 ApplicationContext
- 将
Environment设置到容器中 - 应用所有
ApplicationContextInitializer - 发布
ApplicationContextInitializedEvent
第四阶段:刷新容器(refresh)
这个是最重要的环节,由 SpringApplication#refreshContext 调用 Spring 容器的标准生命周期方法 context.refresh()。
主要做的事:
- BeanDefinition 加载:扫描
@ComponentScan、导入配置类、加载自动配置类(@EnableAutoConfiguration) - BeanFactoryPostProcessor 执行:允许修改 Bean 定义
- BeanPostProcessor 注册:Bean 初始化前后执行增强
- 单例 Bean 实例化
- WebServer 创建(比如内置 Tomcat 启动)
- 发布
ContextRefreshedEvent
第五阶段:执行 Runners
- 查找并执行
ApplicationRunner和CommandLineRunner - 用于在应用启动完成后,执行一些初始化逻辑
第六阶段:启动完成
- 发布
ApplicationReadyEvent - 表示应用完全启动,可以对外提供服务
4. 总结流程(关键事件顺序)
- ApplicationStartingEvent → 应用开始启动
- ApplicationEnvironmentPreparedEvent → 环境准备完成
- ApplicationContextInitializedEvent → 上下文初始化
- ApplicationPreparedEvent → Bean 定义加载完成
- ContextRefreshedEvent → 容器刷新完成
- ApplicationStartedEvent → 应用已启动
- ApplicationReadyEvent → 应用准备就绪
5. 总结
一句话概括 Spring Boot 启动流程:
先创建
SpringApplication→ 初始化环境 → 创建并刷新容器 → 加载自动配置和 Bean → 启动内置 Web 容器 → 执行 Runner → 发布就绪事件。

浙公网安备 33010602011771号