SpringBoot启动过程

1.1SpringBoot启动流程

1、从main方法开始。首先运行静态的run方法,创建一个springApplication对象,再运行run方法,工厂初始化配置在构造函数中完成。

初始化配置:通过类加载器,(loadFactories)读取classpath下所有的spring.factories配置文件,创建一些初始化配置对象;

通知监听器应用程序启动开始,创建环境对象environment,用于读取环境配置,如application.yml.

2、创建应用程序上下文-createApplicationContext,创建bean工厂对象

3、刷新上下文(启动核心)refreshContxt(工厂对象配置、bean处理器配置、类的扫描、解析、bean定义、bean类信息缓存、服务器Tomcat创建、bean实例化、动态代理对象创建)。

  3.1 配置工厂对象,包括上下文类加载器,对象发布处理器,beanFactoryPostProcessor。

  3.2 注册并实例化bean工厂发布处理器,并且调用这些处理器,对包扫描(主要是class)文件。

  3.3 注册并实例化bean发布处理器beanPostProcessor。

  3.4 初始化一些与上下文有特别关系的bean对象(创建tomcat服务器)

  3.5 实例化所有bean工 程缓存的bean对象

  3.6 发布通知上下文刷新完成(启动tom  cat)

4、通知监听者-启动程序完成

  启动中大部分对象都是beanFactory对象通过反射创建

https://www.cnblogs.com/Narule/p/14253754.html 参考。

 

一、创建SpringApplication应用

1、保存信息(),ClassUtils,

2、判断当前有没有reactive响应式编程

3、bootstrapers,初始启动引导器(List<BootStrapers>):去spring.factories中找 org.springframework.bootstraper

4、找ApplicationContextInitializer;去找spring.factories找ApplicationContextInitializer

  4.1:List<ApplicationContxtInitializer>

5、找ApplicationListener:应用监听器。

  5.1:List<ApplicationListener>

二、运行SpringApplication应用

1、StopWatch保存一些信息,应用名字,当前启动时间

2、创建引导上下文(context)

  2.1:获取到所有之前创建的bootstrapers,挨个执行initialize方法,来完成对引导启动器上下文环境设置。

3、让当前应用进入headless模式。(用于在缺失显示屏、鼠标、键盘时候的系统配置)

4、获取所有RunListener运行时监听器(为了方便所有Listener进行事件感知,项目在启动)

  4.1getSpringFactoriesInstances去Spring.factories找SpringApplicationRunListener  

  4.2遍历所有SpringApplicationRunListener,调用starting方法,监听所有项目运行的状态(通知所有感兴趣系统正在启动过程的代码,项目正在starting)

  4.3保存命令行参数;

  4.4准备环境prepareEnviroment

   4.4.1返回创建基础环境信息。StandardServletEnviroment

   4.4.2配置环境信息对象(properties等)

     4.4.2.1 读取所有配置元的配置属性

   4.4.3绑定环境信息

   4.4.4监听器调用environmentPrepared;通知所有监听器,当前环境准备完成。

   4.5创建IoC容器(createApplicationContext)

       4.5.1根据项目类型(Servlet)创建容器

    4.5.2当前会创建AnnotationConfigServletWebServerApplicationContext;

  4.6准备ApplicationContext IOC容器基本信息 prepareContext方法)

   4.6.1 保存环境信息

      4.6.2 IOC容器的后置处理流程

   4.6.3 应用初始化;applyInitializers

    4.6.3.1 遍历所有的ApplicationContxtInitializer,调用initialize,来对IOC容器进行初始化扩展

     4.7.4 遍历所有的Listener调用ContextPrepared。EventPublishListener;通知所有的监听器ContextPrepared

     4.7.5 所有监听器 调用contextLoaded,通知上下文IOC容器加载完成。

       4.7刷新IOC容器refresh(核心源码)

    4.7.1创建容器中的所有组件

  4.8刷新容器后的工作

    4.8.1所有监听器调用started方法,当前项目启动了

  4.9调用runner方法;callRunners()

    4.9.1获取容器中的ApplicationRunner

    4.9.2获取容器中CommandLineRunner

    4.9.3合并所有runner,并且按照@order进行排序

    4.9.4遍历所有的runner调用run方法。

  4.10如果有异常会调用Listener的failed方法

  4.11调用所有监听器running方法Listener.running方法

  4.12running方法如果有异常,还是调用Listener的failed方法。

posted @ 2022-05-09 09:35  雷雷提  阅读(6337)  评论(0编辑  收藏  举报