Spring Boot 启动流程源码剖析
一行
SpringApplication.run()背后发生了什么?从 main 方法到 Tomcat 启动,全程拆解 Spring Boot 的启动流程。
一、启动入口 SpringApplication.run()
- 1.1
@SpringBootApplication的三个核心注解 - 1.2 创建
SpringApplication实例——推断应用类型(Servlet/Reactive) - 1.3 设置 Initializers 和 Listeners——SPI 机制获取
二、Environment 准备
- 2.1
prepareEnvironment()——加载配置文件 - 2.2
ConfigFileApplicationListener——application.yml 的加载顺序 - 2.3 profile 激活机制——
spring.profiles.active
三、Banner 与 ApplicationContext 创建
- 3.1 Banner 的打印——可以自定义
- 3.2
createApplicationContext()——根据应用类型创建对应容器 - 3.3 AnnotationConfigServletWebServerApplicationContext
四、prepareContext——准备上下文
- 4.1 设置 environment
- 4.2
postProcessApplicationContext()——注册 BeanNameGenerator - 4.3
applyInitializers()——执行 ApplicationContextInitializer
五、refreshContext——核心刷新
- 5.1
invokeBeanFactoryPostProcessors()——执行 BeanFactory 后置处理器 - 5.2
registerBeanPostProcessors()——注册 Bean 后置处理器 - 5.3
finishBeanFactoryInitialization()——实例化所有单例 Bean
六、自动配置原理
- 6.1
@EnableAutoConfiguration→@Import(AutoConfigurationImportSelector) - 6.2
spring.factories→spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports - 6.3 条件注解——
@ConditionalOnClass/@ConditionalOnMissingBean等 - 6.4 一个自定义 starter 的实现
七、内嵌 Tomcat 的启动
- 7.1
ServletWebServerApplicationContext.onRefresh() - 7.2
TomcatServletWebServerFactory创建 Tomcat - 7.3 Connector 配置——端口、协议、超时
八、总结
- 启动流程的完整时序图
- 常见启动失败的排查思路——从哪个阶段入手
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!