四阶段分别为:服务构建、环境准备、容器创建和填充容器
服务构建
- 首先把传入的资源加载器、主方法类记录到内存中,然后逐一判断对应的服务类是否存在来确定web服务的类型
- 默认是基于servlet的web服务,如tomcat,还有响应式非阻塞服务reactive,如spring-webflux,还有什么都不是的none
- 确定完选择哪个web服务后就是加载初始化类了,会去读取META-INF/spring.factories文件中的注册初始化、上下文初始化和监听器这三个配置
- 最后是通过运行栈stackTrace判断main方法所在类
环境准备
- 先new一个启动上下文
bootstrapContext,然后调用启动注册初始化器中的初始化方法initialize,但由于没有没默认的初始化器,所以也没初始化什么(这个可以靠手动添加) - 将
java.awt.headless设置为 true,表示缺少显示器、键盘等输出设备也能正常启动 - 然后启动运行监听器,同时发布启动事件,获取并加载springboot工程配置文件中监听器,就可以做到通过监听事件在启动的流程中加入自定义逻辑
- 接下来就是组装启动参数,例如根据不同的web服务构造不同的环境(默认是servlet)、坏境变量、jvm系统属性等,把这些信息加载到一个内存集合中,后续调用就无需重新加载了
容器创建
- 根据服务类型创建容器(默认servlet)注解配置的servlet-web服务容器
- 存放和生产bean实例的Bean工厂
- 用来解析
@Component、@ComponentScan等注解的配置类后处理器 - 用来解析
@AutoWired、@Value等注解的自动注解bean处理器
- 对容器中的部分属性进行初始化
填充容器
- 生产自身提供或者自定义的所有Bean对象,放入容器创建步骤中创建好的容器中,这个过程也叫做自动装配
- 构造启动web服务器
- 回调自定义实现的 Runner 接口,来处理执行后定制化的需求