一行 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.factoriesspring/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 配置——端口、协议、超时

八、总结

  • 启动流程的完整时序图
  • 常见启动失败的排查思路——从哪个阶段入手