Spring Boot启动的时候都干了什么?

243 阅读3分钟

导语

在当前的日常开发中 Spring Boot 是我们使用比较多的一种基础技术框架, 相对于以往使用的Spring Mvc,Spring Boot做了很大的自动化配置, 其实在SpringBoot启动时也做了很多的工作,今天我们来看下SpringBoot启动的时候做了什么。

思维导图

图片如果需要完整版思维导图, 关注微信公众号'程序员小胖'后台回复关键字【SpringBoot启动原理】即可获得完整版

SpringBoot启动流程主要分为以下两大块

SpringBootApplication初始化

  1. 将启动类放入primarySource

图片

  1. 推算当前web应用类型

图片

  1. 读取BootstrapRegistryInitializer扩展点对象

图片图片4. 读取ApplicationContextInitializer初始化器

图片

  1. 读取ApplicationListener监听器

图片

  1. 将main方法所在的类放入mainApplicationClass

图片图片

启动SpringBootApplication

  1. 创建并初始化DefaultBootstrapContext

图片图片

  1. 默认提供一个EventPublishingRunListener,在启动过程中发布事件

图片图片

  1. 调用SpringApplicationRunListeners的方法 发布ApplicationStartingEvent事件

图片图片图片

  1. 将启动参数封装成ApplicationArguments对象

图片

  1. 加载environment
  • 创建environment对象

图片

  • 调用SpringApplicationRunListeners发布ApplicationEnvironmentPreparedEvent事件

图片图片图片

  • EnvironmentPostProcessorApplicationListener 会处理该事件 从Spring.factories中解析各种配置读取EnvironmentPostProcessor 然后分别往environment中添加配置
  1. 打印Banner

图片图片7. 根据web应用类型创建Spring容器

图片

  1. 预处理Spring容器
  • 设置Spring容器的环境变量

图片

  • 通过ApplicationContextInitializer初始化Spring容器

图片图片

  • 通过SpringApplicationRunListeners发布ApplicationContextInitializedEvent 事件

图片图片图片

  • 关闭DefaultBootstrapContext。相当于启动工作结束在上述过程中通过DefaultBootstrapContext来共享对象,避免重复创建某些对象,提升性能

图片图片

  • 将配置注册到Spring容器中

图片

  • 将启动类作为配置类注册到Spring容器中

图片图片

  • 调用SpringApplicationRunListeners的方法发布ApplicationPreparedEvent事件

图片图片图片

  1. 刷新Spring容器 相当于做了一个这个操作
  • AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
  • applicationContext .register(SpringBootApplication.class)
  • applicationContext .refresh()
  1. 刷新Spring容器后处理

图片图片该方法没有做任何的逻辑处理,是一个空的方法,可作为后置处理器自定义实现

  1. 调用SpringApplicationRunListeners发布ApplicationStartedEvent事件

图片图片图片发布ApplicationStartedEvent事件和AvailabilityChangeEvent事件,AvailabilityChangeEvent事件 表示状态变更状态,变更后的状态为LivenessState.CORRECT LivenessState枚举有两个值 CORRECT: 表示当前应用正常运行中 BROKEN: 表示当前应用还在运行, 但是内部出现问题。12. 调用ApplicationRunner和CommandLineRunner 会把前面封装的启动参数传进去

图片图片图片

  • 获取Spring容器中的ApplicationRunner类型的Bean
  • 获取Spring容器中的CommandLineRunner类型的Bean
  • 执行它们的run()
  1. 调用SpringApplicationRunListeners发布ApplicationReadyEvent事件

图片

图片

图片发布ApplicationReadyEvent事件和AvailabilityChangeEvent事件,AvailabilityChangeEvent事件 表示状态变更状态,变更后的状态为ReadinessState.ACCEPTING_TRAFFIC ReadinessState枚举有两个值

  1. ACCEPTING_TRAFFIC: 表示当前应用准备接收请求
  2. REFUSING_TRAFFIC: 表示当前应用拒绝接收请求,比如Tomcat关闭时,就会发布AvailabilityChangeEvent事件,并且状态为REFUSING_TRAFFIC

总结: 通过本次的源码解读,相信你肯定知道了Spring Boot启动的过程中都做了什么,针对比较细节的点还需要后续自己去做深入的研究, 有什么疑问可以随时给我发消息我们一起探讨。