编程框架-springboot启动流程(springboot+2.2.x)

背景

天天在用spring boot,不了解基础的启动流程是真的说不过去。本wiki将进行启动流程阐述。

启动流程

时序图

DemoApplicationSpringApplicationStopWatchSystemSpringFactBeanUtilsSpringApplicatBinderSpringApplicatiSpringBootExcConfigurableAppAbstractAppliListableBeanFactoryApplicationRunnerrun(传入自己的class)构造一个推断web类型、推断main的所在类、初始化上下run创建并时间监控setProperty(设置必要的环境变量)loadFactoryNames(获取META-INF/spring.factories的类名,本次只关心SpringApplicationRunListener)instantiateClass(实例化拿到的类)starting(开始监听)配置web环境和profile等参数(以及客户化环境)SpringApplication和web环境绑定通知web环境准备完毕打印banner图创建指定的上下文org.springframework.context.annotation.AnnotationConfigApplicationContext创建异常报告者(获取META-INF/spring.factories的类名,本次只关心SpringBootExceptionReporter)准备上下文通知准备上下文完成refresh(刷新过程是各种资源的整合过程)完成时间监控started(通知开始完毕)getBeansOfType(获取所有的Runner)run(调起回调)DemoApplicationSpringApplicationStopWatchSystemSpringFactBeanUtilsSpringApplicatBinderSpringApplicatiSpringBootExcConfigurableAppAbstractAppliListableBeanFactoryApplicationRunner

通过listener的视角观察启动过程

创建一个spring boot的Hello项目,并且添加一个listener
编程框架-springboot启动流程(springboot+2.2.x)
添加了断点以后,运行,看看效果
编程框架-springboot启动流程(springboot+2.2.x)
这里可以清楚的看到是进行同步传消息,而且把SpringApplication对象也回调回来了。
initializers一共有7个,listeners共12个(最后一个是我们注册的)。
编程框架-springboot启动流程(springboot+2.2.x)
initializers来源于:
编程框架-springboot启动流程(springboot+2.2.x)
listeners来源于
编程框架-springboot启动流程(springboot+2.2.x)
listener一共回调了n个消息,依次为:

  • ApplicationStartingEvent
  • ApplicationEnvironmentPreparedEvent
  • ApplicationContextInitializedEvent
  • ApplicationPreparedEvent
  • ContextRefreshedEvent
  • ApplicationStartedEvent
  • ApplicationReadyEvent
  • ContextClosedEvent

评价

本wiki都是用的上层概念来进行推测,之后需要深入到每个模块中去,才可以更好的了解其中的过程。