• SpringBoot SpringBoot 原理篇 3 核心原理 3.5 启动流程【4】【5】【6】


    SpringBoot

    【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】

    SpringBoot 原理篇

    3 核心原理

    3.5 启动流程【4】【5】【6】
    3.5.1 看源码咯

    在这里插入图片描述

    OK, 接着上次我们已经把

    在这里插入图片描述

    这个东西了解得差不多了

    在这里插入图片描述

    就是前面这一段,它初始化了SpringBoot 程序的启动的所有相关配置

    接下来就是看后面的run 方法了,点进去

    在这里插入图片描述

    运行整个过程 → 初始化容器【但是过程没那么简单】

    ConfigurableApplicationContext
    
    • 1

    这是run 方法的返回值

    在这里插入图片描述

    一行一行的来看

    StopWatch stopWatch = new StopWatch();
    
    • 1

    计时器

    在这里插入图片描述

    在这里插入图片描述

    就是这样来的【所以,之前的初始化操作都没有算到显示给我们看的那个时间中【假象】】

    【设置了计时器】

    stopWatch.start();
    
    • 1

    【计时器开始】

    DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();
    
    • 1

    【系统引导信息对应的上下文对象】

    ConfigurableApplicationContext context = null;
    
    • 1

    【定义了一个对象】

    this.configureHeadlessProperty();
    
    • 1

    【模拟输入输出信号,避免出现因缺少外设导致的信号传输失败,进而引发错误(模拟显示器、键盘、鼠标…)】

    【java.awt.headless = true;】

    SpringApplicationRunListeners listeners = this.getRunListeners(args);
    
    • 1

    【获取当前注册的可运行的监听器】

    listeners.starting(bootstrapContext, this.mainApplicationClass);
    
    • 1

    【监听器执行了对应的操作步骤】

    到这里其实还是一些准备性的工程,还没开始创建容器

    ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
    
    • 1

    【获取参数】

    ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);
    
    • 1

    【将前期读取的数据加载成了一个环境对象,用来描述信息】

    this.configureIgnoreBeanInfo(environment);
    
    • 1

    【做了一个配置,备用】

    Banner printedBanner = this.printBanner(environment);
    
    • 1

    【初始化启动图标】

    context = this.createApplicationContext();
    
    • 1

    【创建容器对象,根据前期配置的容器类型进行判定并创建】

    context.setApplicationStartup(this.applicationStartup);
    
    • 1

    【设置启动模式】

    this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
    
    • 1

    【对容器进行设置,参数来源于前期的设定】

    this.refreshContext(context);
    
    • 1

    【刷新容器环境】

    this.afterRefresh(context, applicationArguments);
    
    • 1

    【刷新完毕后,做后处理】

    stopWatch.stop();
    
    • 1

    【计时结束】

    if (this.logStartupInfo) {
        (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);
    }
    
    • 1
    • 2
    • 3

    【判定是否记录启动时间的日志】【创建日志对应的对象,输出日志信息,包含启动时间】

    listeners.started(context);
    
    • 1

    【监听器执行了对应的操作步骤】

    listeners.running(context);
    
    • 1

    【监听器执行了对应的操作步骤】

    在这里插入图片描述

    到这儿就结束了

    OK, 回顾一下

    1. 初始化各种属性,加载成对象
    • 读取环境属性(Environment)
    • 系统配置(spring.factories)
    • 参数(Arguments、application.properties)
    1. 创建Spring容器对象ApplicationContext,加载各种配置
    2. 在容器创建前,通过监听器机制,应对不同阶段加载数据、更新数据的需求
    3. 容器初始化过程中追加各种功能,例如统计时间、输出日志等

    【两个阶段】

    【监听器类型】

    1. 在应用运行但未进行任何处理时,将发送 ApplicationStartingEvent。
    2. 当Environment被使用,且上下文创建之前,将发送 ApplicationEnvironmentPreparedEvent。
    3. 在开始刷新之前,bean定义被加载之后发送 ApplicationPreparedEvent。
    4. 在上下文刷新之后且所有的应用和命令行运行器被调用之前发送 ApplicationStartedEvent。
    5. 在应用程序和命令行运行器被调用之后,将发出 ApplicationReadyEvent,用于通知应用已经准备处理请求。
    6. 启动时发生异常,将发送 ApplicationFailedEvent
    3.5.2 总结
    1. 理解过程有助于思考

    李老师牛逼!!!!!!!!!!!!!!!!!!!!!【微服务我来啦!】

  • 相关阅读:
    创建Django项目_first_Django
    Qt安装使用
    力扣shell刷题
    计算机毕业设计php+vue基于微信小程序的员工宿舍报修系统
    jdbc连接oracle数据库
    大模型的语言能力
    齐岳离子液体[C1MIm]SbF6/cas:885624-41-9/1,3-二甲基咪唑六氟锑酸盐/分子式:C5H9F6N2Sb
    期货技术分析难学吗(商品期货学难嘛)
    提分必练!中创教育PMP全真模拟题分享来喽
    大唐电信FPGA设计经验
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/128060893