springboot 启动过程

发布时间 2023-05-29 16:29:25作者: 好记性不如烂笔头=>

SpringBoot启动过程 版本是2.4.5

底层还是用的spring应用,springboot 只是把一些我人工的配置,和功能场景,通过start包,讲一些配置问信息,提前装配好。

黄色标记的都是组件。我们可以实现组件,加入自己的逻辑。在启动过程中,springboot每完成一个重要的组件初始化,都要通知springboot 的监听器的。

1.创建SpringApplication(spring应用)

  ●保存一些信息。

    ●资源加载器 resourceLoader

    ● 比如获取主配置类并保存,获取到主配置类了,就可以回去类的注解,(@SpringBootApplication=》@EnableAutoConfiguration)后面就可以执行自动配置功能。

    ●当前应用的类型(Servlet)。通过 ClassUtils

  ●botstrappers: 初始启动引导器(List<Botstrappers>) :去spring.factories文件中找

    ■可以用来注册一些对象,这些对象可以用在从SpringBoot启动到Spring容器初始化完成的过程中

    ■org-springframework.boot. Bootstrapper

  ●找ApplicatinContextlnitializer;去spring.factories找 ApplicatinContextlnitializer 

    ●用于在spring容器刷新之前初始化初始化Spring应用的 ConfigurableApplicationContext的回调接口 ,通常用于需要对应用程序上下文进行编程初始化的web应用程序中。例如,根据上下文环境注册属性源或激活配置文件等。

    ●List<ApplicationContetInitializer<?> > initializers

  ●找ApplicationListener ;应用监听器。去spring.factories找 ApplcationListener    是spring 应用的监听器,作用于整个Spring上下文,范围更广。

    ■List<ApplicationListener<?>> listeners

2.运行SpringApplication

  ●StopWatch

  ●记录应用的启动时间

  ●创建引导上下文(Context环境) createBootstrapContext()

  ●获取到所有之前的bootstrappers按个执行 Initializer]来完成对引导启动器上下文环境设置。让当前应用进入headless模式。java.awt.headless

  ●获取所有RunListener (运行监听器) [为 了方便所有Listener进行事件感知]

    ●getspringFactoriesInstances 去spring.factories找SpringApplicationRunListener  是在初始化SpringBoot应用时获取的是springBoot 的监听器。ApplicationListener的实现类会被SpringApplicationRunListener代理执行。

  ●遍历SpringApplicationRunListener调用starting方法:

    ●相当于通知所有感兴趣的人,springboot应用正在启动。

  ●保存命令行参数: ApplicationArguments

  ●准备环境prepareEnvironment () ;

    ■返回或者创建基础环境信息对象。StandardServletEnvironment

    ■当前会创建AnnotationConfigServletWebServerApplicationContext

3. 创建ApplicationContext I0C createApplicationContext

4. 准备ApplicationContext I0C容器的基本信息prepareContext0

  ■保存环境信息

  ■I0C容器的后置处理流程.

  ■应用初始化器; applylnitializers;

    ●遍历所有的ApplicationContextinitializer. 调用initialize.. 来对ioc容器进行初始化扩展功能

    ●遍历所有的listener调用contextPrepared. EventPublishRunListenr; 通知所有的监听器contextPrepared

  ■所有的监听器调用contextLoaded.通知所有的监听器contextLoaded;

5. 刷新IOC容器。refreshContext

  ■创建容器中的所有组件(Bean 的生命周期逻辑 )

。容器刷新完成后工作? afterRefresh

。所有监听器调用listeners started(context;通知所有的监听器started)

6. 调用所有runners; callRunners0    springBoot项目启动时候,有时候需要再启动之后直接执行某一段代码。这个时候就用到了 ApplicationRunner /CommandLineRunner 这个类。

  ■获取容器中的ApplicationRunner

  ■获取容器中的CommandLineRunner

  ■合并所有runner并且按照@Order进行排序

  ■遍历所有的runner.调用run方法

7.如果以上有异常

  ■调用Listener的failed

。调用所有监听器的running方法lsteners.unningicontext: 通知所有的监听器running

。running如果有问题。 继续通知filed。调用所有Listener的filed; 通知所有的监听器falled