SpringBoot应用启动流程简介

目录

1、应用开始启动

2、应用环境准备

3、应用上下文初始化

4、应用准备

5、应用启动

5.1、应用上下文刷新

6、应用就绪


SpringBoot应用从整体生命周期看,可以划分为SpringApplication初始化阶段、SpringApplication运行阶段、SpringApplication结束阶段、SpringBoot应用退出等四个主要阶段。

SpringBoot应用启动流程,它基本上涵盖了SpringApplication初始化、SpringApplication运行两个阶段。按照SpringBoot应用的生命周期事件,可以把启动流程划分为应用开始启动、应用环境准备、应用上下文初始化、应用准备、应用启动、应用就绪等六个步骤。

1、应用开始启动

从启动引导类开始,然后创建和配置SpringApplication、创建事件监听器等,到发布ApplicationStartingEvent应用开始启动事件为止,属于应用开始启动步骤;

2、应用环境准备

封装命令行参数、加载系统变量、系统属性、发布ApplicationEnviromentPreparedEvent应用环境准备事件以及触发加载配置文件为止,属于应用环境准备步骤;

3、应用上下文初始化

打印banner信息、创建应用上下文、加载异常报告器、绑定环境变量、注册beanName生成器、绑定资源和类加载器、应用初始化器、发布ApplicationContextInitializedEvent应用上下文初始化事件为止(注意2.0.4版本未实现发布此事件),属于应用上下文初始化步骤;

4、应用准备

注册命令行参数和banner对象、加载主要配置源、发布ApplicationPreparedEvent应用准备事件等,属于应用准备步骤,应用上下文初始化和应用准备两个步骤实际上是在同一个方法(SpringApplication#prepareContext)内完成的。

5、应用启动

应用启动步骤从刷新应用上下文开始、中间包括调用afterRefresh空方法、打印启动日志、发布ApplicationStartedEvent应用启动事件以及AvailabilityChangeEvent可用性变更事件等。

5.1、应用上下文刷新

应用上下文刷新步骤主要就是调用抽象应用上下文AbstractApplicationContext的refresh方法创建和初始化SpringIOC容器,从准备刷新到完成刷新发布ContextRefreshedEvent上下文就绪事件为止,此事件属于Spring生命周期事件。刷新应用上下文是SpringBoot或者说Spring应用启动流程最核心的部分,自动装配和配置类注解的解析、bean定义的注册、单例的初始化、以及web服务器的启动都在此步骤中完成;期间发布了属于Spring的ContextRefreshedEvent上下文就绪事件。应用上下文刷新步骤可以细分为12个小步骤:

  • prepareRefresh

上下文刷新准备,比如获取容器当前时间、设置容器同步标识等

  • obtainFreshBeanFactory

获取刷新或新的BeanFactory,告知子类刷新内部的BeanFactory,比如基于xml的子类上下文会解析和注册bean定义

  • prepareBeanFactory

准备当前获取的BeanFactory,比如配置容器特性、如类加载器、事件处理器等

  • postProcessBeanFactory

让上下文子类对BeanFactory进行后置处理,比如注册BeanFactoryPostProcessor处理器、扫描解析bean定义等等,如果SpringBoot应用的上下文之前通过register或scan方法注册或指定了包等配置源,将会触发配置源的解析扫描

  • invokeBeanFactoryPostProcessors

调用所有注册的BeanFactoryPostProcessor后置处理器,基于Java配置文件注解方式的上下文将开始解析和注册bean,如SpringBoot开发的应用,自动配置等解析在这个步骤中触发

  • registerBeanPostProcessors

注册BeanPostProcessor处理器,即bean的后置处理器,在bean调用初始化方法的前后可以进行一些特殊处理

  • initMessageSource

初始化信息源,如国际化相关的内容

  • initApplicationEventMulticaster

初始化容器事件广播器,用于向注册的监听器广播事件

  • onRefresh

由子类实现OnRefresh方法,让子类可以初始化某些特定的bean,SpringBoot应用的上下文重载了此方法,在这个步骤中启动了内嵌的Web容器

  • registerListeners

检查并注册监听器bean

  • finishBeanFactoryInitialization

初始化剩下的所有非延迟加载的单例bean,这个过程涉及了bean的生命周期知识,包括各种Aware接口方法、初始化相关方法、bean的前后置处理器方法等的回到,以及bean销毁相关方法的回调注册等

  • finishRefresh

最后一步,发布相应的事件:ContextRefreshedEvent上下文就绪事件,即上下文刷新完成事件

6、应用就绪

在应用就绪步骤中,SpringBoot做了两件事,第一个是运行注册在上下文中的所有ApplicationRunner和CommandLineRunner对象定义的任务;第二个就是发布ApplicationReadyEvent应用就绪事件以及AvailabilityChangeEvent可用性变更事件,将应用标识为等待接受请求的状态ReadinessState.ACCEPTING_TRAFFIC。两件事情做完之后,SpringBoot应用便开始正常对外提供服务,处于就绪状态。

启动流程各个步骤源码分析可参考 SpringBoot启动流程源码分析 

你可能感兴趣的:(SpringBoot实战,spring,java,spring,boot)