springboot的启动流程原理

发布于:2024-08-22 ⋅ 阅读:(133) ⋅ 点赞:(0)

目录

 一:入口简介:

二。创建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 

网站公告

今日签到

点亮在社区的每一天
去签到