关于springboot:82springboot启动过程总结

44次阅读

共计 2330 个字符,预计需要花费 6 分钟才能阅读完成。

springboot 启动过程总结:

1、SpringBoot 启动过程

有两大步:①传入 spring 利用,而后创立 spring 利用 ②把 spring 利用跑起来

- 创立 SpringApplication

  - 保留一些信息。- 断定以后利用的类型。Servlet or 响应式编程
  - bootstrappers:初始启动疏导器(List<Bootstrapper>):去 spring.factories 文件中找 org.springframework.boot.Bootstrapper
  - 找 ApplicationContextInitializer;去 spring.factories 找 ApplicationContextInitializer
    - 封装到 List<ApplicationContextInitializer<?>> initializers

  - 找 ApplicationListener 利用监听器。去 spring.factories 找 ApplicationListener
    - 封装到 List<ApplicationListener<?>> listeners

简略来说,利用创立的过程,就是把一些要害的主键去 spring.factories 文件给咱们读取信息读取进去,提前保留到 springapplication 里



- 运行 SpringApplication

  - StopWatch 进行监听器
    - 记录利用的启动工夫

  - 创立疏导上下文(Context 环境)createBootstrapContext()
    - 获取到所有之前保留的 bootstrappers 挨个执行他们的 intitialize() 来实现对疏导启动器上下文环境设置

  - 让以后利用进入 headless 模式。java.awt.headless(headless 是自力更生的意思,不依赖他人)- 获取所有 RunListener(运行监听器)【为了不便所有 Listener 进行事件感知】- getSpringFactoriesInstances 去 spring.factories 找 SpringApplicationRunListener. 

  - 遍历所有的 SpringApplicationRunListener 调用 starting 办法;- 相当于告诉所有感兴趣零碎正在启动过程的人,我的项目正在 starting。(即通知我这个我的项目正在启动)- 保留命令行参数;ApplicationArguments

    

  - 筹备环境,调用 prepareEnvironment();

    - 返回或者创立根底环境信息对象。StandardServletEnvironment
    - 配置环境信息对象。- 读取所有的配置源的配置属性值。- 绑定环境信息
    - 遍历每个监听器,调用 listener.environmentPrepared();告诉所有的监听器以后环境筹备实现

  - 创立 IOC 容器(调用 createApplicationContext())- 依据我的项目类型(Servlet)创立容器,- 以后会创立 AnnotationConfigServletWebServerApplicationContext

  - 筹备 ApplicationContext IOC 容器的根本信息  调用 prepareContext()

    - 保留环境信息
    - IOC 容器的后置解决流程。- 利用初始化器:applyInitializers;- 遍历所有的 ApplicationContextInitializer。调用 initialize.。来对 ioc 容器进行初始化扩大性能
      - 遍历所有的 listener 调用 contextPrepared。实际上是 EventPublishRunListenr:告诉所有的监听器 contextPrepared 容器的上下文环境曾经筹备好了

    - 所有的监听器 调用 contextLoaded。告诉所有的监听器 contextLoaded;容器的上下文环境曾经加载好了

  - 刷新 IOC 容器。refreshContext
    - 创立容器中的所有组件

  - 容器刷新实现后要做的工作(调用 afterRefresh())- 遍历所有监听器 调用 listeners.started(context); 告诉所有的监听器 started 我的项目曾经启动了(告诉监听器又一个事干好了)所以在这里就能够拜访 8080 了

  - 调用所有 runners;(调用 callRunners())- 获取容器中的 ApplicationRunner 

    - 获取容器中的 CommandLineRunner

    - 合并所有 runner 并且依照 @Order 进行排序

    - 遍历所有的 runner。调用 run 办法

  - 如果从 ` 筹备环境,调用 prepareEnvironment()到这里 ` 有异样,- 调用 Listener 的 failed

      

  - 没有任何异样就 调用所有监听器的 running 办法  listeners.running(context); 告诉所有的监听器 running 我的项目曾经进入 running 状态了

  - running 如果有问题。持续告诉 failed。调用所有 Listener 的 failed;告诉所有的监听器 failed 以后我的项目运行失败 
 只有看到这个 getSpringFactoriesInstances()办法,都是去 spring.factories 文件找货色 
springboot 启动过程波及到的组件有:ApplicationContextInitializer, ApplicationListener, SpringApplicationRunListener,ApplicationRunner,CommandLineRunner
咱们就能够通过自定义组件,来监控 springboot 整个启动过程,而后在某个时刻做一些事件 

正文完
 0