目录
一:入口简介:
二。创建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 


![[数据集][目标检测]工程机械车辆检测数据集VOC+YOLO格式3189张10类别](https://i-blog.csdnimg.cn/direct/3e6cd846b25148a99f7521686daa0036.png)








![[Algorithm][贪心][跳跃游戏][加油站][单调递增的数字][坏了的计算器]详细讲解](https://i-blog.csdnimg.cn/direct/53e8ddde95b74d5595fdafe30377c4e2.png)


![[数据集][目标检测]快递包裹检测数据集VOC+YOLO格式5382张1类别](https://i-blog.csdnimg.cn/direct/77c5fbebce094277940039df81401882.jpeg)



