sprigboot初始化流程

  • Post author:
  • Post category:其他




初始化流程



过程

  • 创建

    SpringApplication

    • 保存了一些信息
    • 判定当前应用的类型,

      ClassUtils.servlet

    • bootstrappers

      :初始启动引导器(

      List< booterstrapper>

      ),去

      spring.factories

      文件中找

      org.springframework.boot.Bootstrapper


    • ApplicationContextInitializer

      初始化器:去

      spring.factories

      文件中找

      ApplicationContextInitializer


      • List<ApplicationContextInitializer<?>> initializer


    • ApplicationListener

      :找一个应用的监听器,去

      spring.factories

      文件中找

      ApplicationListener


      • List< ApplicationListener<?>> listeners
  • 运行

    SpringApplication


    • StopWatch
    • 记录应用的启动时间
    • 创建引导上下文(Context环境)

      • 获取到所有之前的

        bootstrappers

        挨个执行

        initialize()

        来完成对引导启动器上下文环境设置
    • 让当前应用进入 headless 模式。

      java.awt.headless
    • 获取所有的

      RunListener

      (运行时监听器)【为了方便所有Listener进行时间感知】


      • getSpringFactoriesInstances



        spring.factories



        SpringApplicationRunListener.class
    • 遍历所有的

      SpringApplicationRunListener

      调用 starting 方法

      • 相当于通知所有感兴趣系统正在启动过程的人,项目正在starting。
    • 保存命令行参数:

      ApplicationArguments
    • 准备环境

      prepareEnvironment()

      • 返回或创建一个基础环境信息对象:

        StandardServletEnvironment
      • 配置环境信息对象

        • 读取所有的配置源属性值
      • 绑定环境信息
      • 监听器调用

        listener.environmentPrepared()

        ,通知所有的监听器当前环境准备完成
    • 创建 IOC 容器:

      createApplicationContext()

      • 根据项目类型(Servlet)创建容器
      • 当前会创建

        AnnotationConfigServletWebServerApplicationContext
    • 准备

      ApplicationContext

      IOC容器的基本信息:

      prepareContext()

      • 保存环境信息
      • IOC容器的后置处理流程
      • 应用初始化器:

        applyInitializers

        • 遍历所有的

          ApplicationContextInitializer

          ,调用

          initizlie()

          ,来对 IOC容器进行初始化扩展功能
        • 遍历所有的

          listener

          调用

          contextPrepared



          EventPublishRunListener

          通知所有监听器contextPrepared
      • 所有的监听器,调用

        ContextLoaded

        ,通知所有的监听器contextPrepared
    • 刷新IOC容器。refreshContext

      • 创建容器中的所有组件
    • 容器刷新文成后工作。

      afterRefresh
    • 所有监听器调用

      listeners.started(context)

      ,通知所有监听器started
    • 调用所有的 runners。

      callRunners()

      • 获取容器中的

        ApplicationRunner
      • 获取容器中的

        CommandLineRunner
      • 合并所有 runner 并按照 @Order 进行排序
      • 遍历所有的 runner,调用 run 方法
    • 如果以上有异常

      • 调用 Listener 的 failed()
    • 调用所有监听器的 running 方法

      listeners.running(context)

      。通知所有监听器 running
    • 如果running有异常

      • 调用所有 Listener 的 failed()
      • 通知所有监听器 failed
public interface BootStrapper{
    void initialize(BootstrapRegistry registry);
}
@FuncationalInterface
public interface ApplicationRunner{
    void run(ApplicationArguments args) throws Exception;
}
@FuncationalInterface
public interface CommandLineRunner{
    void run(String... args) throws Exception;
}



版权声明:本文为sprintline原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。