导语
在当前的日常开发中 Spring Boot 是我们使用比较多的一种基础技术框架, 相对于以往使用的Spring Mvc,Spring Boot做了很大的自动化配置, 其实在SpringBoot启动时也做了很多的工作,今天我们来看下SpringBoot启动的时候做了什么。
思维导图
如果需要完整版思维导图, 关注微信公众号'程序员小胖'后台回复关键字【SpringBoot启动原理】即可获得完整版
SpringBoot启动流程主要分为以下两大块
SpringBootApplication初始化
- 将启动类放入primarySource
- 推算当前web应用类型
- 读取BootstrapRegistryInitializer扩展点对象
4. 读取ApplicationContextInitializer初始化器
- 读取ApplicationListener监听器
- 将main方法所在的类放入mainApplicationClass
启动SpringBootApplication
- 创建并初始化DefaultBootstrapContext
- 默认提供一个EventPublishingRunListener,在启动过程中发布事件
- 调用SpringApplicationRunListeners的方法 发布ApplicationStartingEvent事件
- 将启动参数封装成ApplicationArguments对象
- 加载environment
- 创建environment对象
- 调用SpringApplicationRunListeners发布ApplicationEnvironmentPreparedEvent事件
- EnvironmentPostProcessorApplicationListener 会处理该事件 从Spring.factories中解析各种配置读取EnvironmentPostProcessor 然后分别往environment中添加配置
- 打印Banner
7. 根据web应用类型创建Spring容器
- 预处理Spring容器
- 设置Spring容器的环境变量
- 通过ApplicationContextInitializer初始化Spring容器
- 通过SpringApplicationRunListeners发布ApplicationContextInitializedEvent 事件
- 关闭DefaultBootstrapContext。相当于启动工作结束在上述过程中通过DefaultBootstrapContext来共享对象,避免重复创建某些对象,提升性能
- 将配置注册到Spring容器中
- 将启动类作为配置类注册到Spring容器中
- 调用SpringApplicationRunListeners的方法发布ApplicationPreparedEvent事件
- 刷新Spring容器 相当于做了一个这个操作
- AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
- applicationContext .register(SpringBootApplication.class)
- applicationContext .refresh()
- 刷新Spring容器后处理
该方法没有做任何的逻辑处理,是一个空的方法,可作为后置处理器自定义实现
- 调用SpringApplicationRunListeners发布ApplicationStartedEvent事件
发布ApplicationStartedEvent事件和AvailabilityChangeEvent事件,AvailabilityChangeEvent事件 表示状态变更状态,变更后的状态为LivenessState.CORRECT LivenessState枚举有两个值 CORRECT: 表示当前应用正常运行中 BROKEN: 表示当前应用还在运行, 但是内部出现问题。12. 调用ApplicationRunner和CommandLineRunner 会把前面封装的启动参数传进去
- 获取Spring容器中的ApplicationRunner类型的Bean
- 获取Spring容器中的CommandLineRunner类型的Bean
- 执行它们的run()
- 调用SpringApplicationRunListeners发布ApplicationReadyEvent事件
发布ApplicationReadyEvent事件和AvailabilityChangeEvent事件,AvailabilityChangeEvent事件 表示状态变更状态,变更后的状态为ReadinessState.ACCEPTING_TRAFFIC ReadinessState枚举有两个值
- ACCEPTING_TRAFFIC: 表示当前应用准备接收请求
- REFUSING_TRAFFIC: 表示当前应用拒绝接收请求,比如Tomcat关闭时,就会发布AvailabilityChangeEvent事件,并且状态为REFUSING_TRAFFIC
总结: 通过本次的源码解读,相信你肯定知道了Spring Boot启动的过程中都做了什么,针对比较细节的点还需要后续自己去做深入的研究, 有什么疑问可以随时给我发消息我们一起探讨。