【独家揭秘】Spring boot 启动源码解析,开发者必看!

关注微信公众号 “程序员小胖” 每日技术干货,第一时间送达!

导语

在当前的日常开发中 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启动的过程中都做了什么,针对比较细节的点还需要后续自己去做深入的研究, 有什么疑问可以随时给我发消息我们一起探讨。

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值