好的 👍,我来给你梳理一下 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 → 发布就绪事件。