SpringBoot启动流程

启动流程主要分为三个步骤
1、进行SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器
2、实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块、及核心的创建Spring上下文环境模块
3、自动化配置模块,开模块是SpringBoot自动配置的核心

宏观步骤

1、创建并启动及时监控类StopWatch
2、初始化应用上下文和异常报告集合(ConfigurableApplicationContext和Collection< SpringBootExceptionReporter >)
3、设置系统属性configureHeadlessProperty()
4、创建Spring运行的监听器并启动
5、初始化默认应用参数类
6、准备Spring环境
7、创建beanner打印类
8、创建应用Spring上下文(也就是spring容器)
9、准备异常报告类
10、准备应用上下文(也就是spring容器)
11、刷新上下文(也就是spring容器)
12、应用上下文刷新后置处理(也就是spring容器)
13、停止计时监控类
14、输出日志信息
15、发布应用上下文启动完成事件
16、执行所有Runner运行器(如果实现CommandLineRunner接口)
17、发布应用上下文就绪事件
18、完成返回容器对象

源码分析

springboot 实现简易工作流 springboot业务流程_spring


springboot 实现简易工作流 springboot业务流程_java_02


springboot 实现简易工作流 springboot业务流程_初始化_03


springboot 实现简易工作流 springboot业务流程_java_04


//这个run方法主要做两个事情

1、new了一个SpringApplication这么一个对象

(1)把main方法这个类赋给一个成员变量

(2)判断是java项目还是web项目

(3)设置了一个初始化器和事件发送的监听器

2、然后执行SpringApplication对象的run方法()

springboot 实现简易工作流 springboot业务流程_spring boot_05


springboot 实现简易工作流 springboot业务流程_初始化_06

这里面用到类一种类似于Java SPI机制的方式扫描META-INF/spring.factories这个文件,并且加载ApplicationContextInitializer、ApplicationListener接口实例

(1)ApplicationContextInitializer这个类当springboot上下文Context初始化完成后会调用

(2)ApplicationListener当springboot启动时事件change后都会触发,我们可以自定义实现ApplicationContextInitializer、ApplicationListener接口,然后运行时会被触发执行。

springboot 实现简易工作流 springboot业务流程_java_07


springboot 实现简易工作流 springboot业务流程_spring_08


springboot 实现简易工作流 springboot业务流程_java_09


springboot 实现简易工作流 springboot业务流程_spring boot_10


springboot 实现简易工作流 springboot业务流程_springboot 实现简易工作流_11


springboot 实现简易工作流 springboot业务流程_java_12


springboot 实现简易工作流 springboot业务流程_初始化_13


springboot 实现简易工作流 springboot业务流程_java_14


onRefresh()方法中可以看到内置的tomcat容器的创建

总结

1、new了一个SpringApplication对象,使用一种类似于SPI机制的技术加载ApplicationContextInitializer、ApplicationListener接口实例
2、调用SpringApplication.run()方法
3、嗲用createApplicationContet()方法创建Spring IOC上下文对象,创建上下文对象同时会注册spring的核心组件类ConfigurationClassPostProcessor\AutowiredAnnotationBeanPostProcessor等
4、调用refreshContext()方法启动Spring容器和内置的Servlet容器