目录
一:入口简介:
二。创建SpringApplication对象
1.推倒出当前项目的启动类型
2.设置Initializer初始化器
3.初始化Listerner监听器
4.反推出main方法所在的class对象。
三.运行SpringApplication#run(java.lang.String...)方法
1):获取运行监听器:
2)发布启动过程中各阶段事件
3)准备环境Environment
4)创建ApplicationContext IOC容器
5)准备ApplicationContext IOC容器的基本信息
6)刷新IOC容器
7)调用所有runners
一:入口简介:
首先,分析启动流程,就要 找到入口.
启动流程的入口方法就是这个run方法:
点进去之后就是这样:
主要分为了两个步骤:
1.创建springBootApplication对象
2.运行SpringApplication#run(java.lang.String...)方法;
上面说了主要分为两个步骤,那么接下来我们就逐个分析,先来分析 创建SpringApplication对象。
二。创建SpringApplication对象
我们从这里点击进去:
就会看到这些:
其中主要分为四个步骤:
1.推倒出当前项目的启动类型
上面的第一个步骤点击进来:可以看到,根据是否引入特定的依赖来我看我们的项目类型。我们项目是servlet:
2.设置Initializer初始化器
上面第二部点进来,发现最终是:
springboot通过加载配置在spring.factories文件中的ApplicationContextInitializer对应的类型并实例化,并将加载的数据存储在了 initializers 成员变量中。:
补充一下,第二步骤的点击时候的参数ApplicationContextInitializer就是从这里拿到的:
3.初始化Listerner监听器
上面的第三步点进来,发现是将其存到了变量中:
springboot通过加载配置在spring.factories文件中的ApplicationListener对应的类型并实例化,并将加载的数据存储在了 listeners 成员变量中。
补充,上面的 ApplicationListener是从这里拿的:
4.反推出main方法所在的class对象。
listeners.starting(bootstrapContext, this.mainApplicationClass);
由上面第四步点击进来后,从执行的堆栈中拿出信息,我们看到执行的就是main方法:
我们debug一下,就可以看到拿到的是我们启动的类:
三.运行SpringApplication#run(java.lang.String...)方法
下面代码是run方法里的:这个是spring的核心启动方法:其中包括了准备环境、配置文件的解析、创建IOC容器、内嵌servlet web容器的启动、事件广播等核心逻辑。
public ConfigurableApplicationContext run(String... args) {
long startTime = System.nanoTime();
DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();
ConfigurableApplicationContext context = null;
this.configureHeadlessProperty();
//第一步:获取运行监听器
SpringApplicationRunListeners listeners