spring boot 启动流程

2023-11-10

计时器开始计时

headless模式赋值

发送ApplicationAStartingEvent

配置环境模块

发送ApplicationEnvironmentPreparedEvent

打印banner

创建上下文应用对象

初始化失败分析器

关联SpringBoot组件和应用上下文对象

发送ApplicationContextiNitializedEvent

加载sources到context

 发送applicationPreparedEvent

刷新上下文

计时器停止计时

发送applicationStartedEvent

调用框架启动扩展类

发送applicationReadyEvent

 

框架自动化装配步骤:

1)收集配置文件中的配置工厂类

2)加载组件工厂

3)注册组件内定义bean

 

public ConfigurableApplicationContext run(String... args) {
        //记录程序运行时间
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        // ConfigurableApplicationContext Spring 的上下文
        ConfigurableApplicationContext context = null;
        Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
        configureHeadlessProperty();
        //从META-INF/spring.factories中获取监听器
        //1、获取并启动监听器
        SpringApplicationRunListeners listeners = getRunListeners(args);
        listeners.starting();
        try {
            //2、将参数赋值进ApplicationArguments意味着这个类是用于存储run方法的参数
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(
                    args);
            //3、构造容器环境
            ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
            //处理需要忽略的Bean
            configureIgnoreBeanInfo(environment);
            //打印banner
            Banner printedBanner = printBanner(environment);
            ///3、初始化容器
            context = createApplicationContext();
            //实例化SpringBootExceptionReporter.class,用来支持报告关于启动的错误
            exceptionReporters = getSpringFactoriesInstances(
                    SpringBootExceptionReporter.class,
                    new Class[]{ConfigurableApplicationContext.class}, context);
            //4、刷新容器前的准备阶段
            prepareContext(context, environment, listeners, applicationArguments, printedBanner);
            //5、刷新容器
            refreshContext(context);
            //刷新容器后的扩展接口
            afterRefresh(context, applicationArguments);
            stopWatch.stop();
            if (this.logStartupInfo) {
                new StartupInfoLogger(this.mainApplicationClass)
                        .logStarted(getApplicationLog(), stopWatch);
            }
            listeners.started(context);
            callRunners(context, applicationArguments);
        } catch (Throwable ex) {
            handleRunFailure(context, ex, exceptionReporters, listeners);
            throw new IllegalStateException(ex);
        }

        try {
            listeners.running(context);
        } catch (Throwable ex) {
            handleRunFailure(context, ex, exceptionReporters, null);
            throw new IllegalStateException(ex);
        }
        return context;
    }

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring boot 启动流程 的相关文章

  • anaconda 安装 for macOSX

    步骤 1 登陆官网 https www anaconda com 2 点击 get started 开始 3 选择下载 下载 4 根据自己的电脑来选择下载的方式 我用的是mac所以就选择这个 这里有两种选择 其实都可以 选择一个就行 4 1
  • osgEarth的Rex引擎原理分析(二十一)创建瓦片模型过程详解

    目标 十七 中问题47 瓦片模型的作用是负责管理瓦片中的影像 高程等图层信息 这些信息的获取最终通过createTileModel函数来实现 负责维护瓦片版本等 应当是每一个瓦片都对应有一个瓦片模型 这个瓦片模型是在瓦片请求过程中创建的 具
  • 面试最常被问的 Java 后端题目及参考答案

    一 Java 基础篇 1 Object 有哪些常用方法 大致说一下每个方法的含义 2 Java 创建对象有几种方式 3 获取一个类对象的方式有哪些 4 ArrayList 和 LinkedList 的区别有哪些 5 用过 ArrayList

随机推荐

  • next.js中引入sass

    第一步 安装sass npm install save zeit next sass node sass 第二步 在项目根目录添加 next config js 文件 用于指示Next加载对用的功能 const withSass requi
  • 基础软件与开发语言开源论坛

    ChinaOSC 2022基础软件与开发语言开源技术论坛将于8月20日 14 00 18 00在陕西省西安高新国际会议中心召开 论坛邀请到在操作系统 中间件等基础软件领域 以及编程语言领域深耕多年的开源专家 深度分享开源软件研发的创新之路
  • 【Pandas总结】第九节 Pandas_累计与分组 pd.groupby()

    文章目录 一 数据准备 二 累计值计算 2 1 df describe 2 2 常用统计值 三 分组 pd groupby 四 更多的使用方法 aggregate filter transform apply 4 1 aggregate 4
  • [Kafka] - Kafka Java Producer代码实现

    根据业务需要可以使用Kafka提供的Java Producer API进行产生数据 并将产生的数据发送到Kafka对应Topic的对应分区中 入口类为 Producer Kafka的Producer API主要提供下列三个方法 public
  • webview拦截垃圾电信运营商的广告方法

    mWebView setWebViewClient new WebViewClient Override public boolean shouldOverrideUrlLoading WebView view String url if
  • terminated 线程_Java中如何正确地中断一个线程?

    本文主要整理了关于线程中断的相关知识点 1 线程的状态 NEW 新建 一个尚未启动的线程处于这一状态 A thread that has not yet started is in this state RUNNABLE 可运行 一个正在
  • QT实现塔防游戏

    在基本功能实现后 对游戏进行优化 主要有以下几部分 实现传奇的升级 实现传奇的移除 绘画出波数与血量 实现游戏的暂停与回到选关关卡 实现游戏的胜利与失败 1 实现传奇的升级 创建一个selectbutton2类 ifndef SELECTB
  • 【华为OD机试真题 Python】多个数组合并

    前言 本专栏将持续更新华为OD机试题目 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于OD机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email nansun09
  • 如何让RecyclerView滑动到底部?

    在做这个功能时 使用scroll的任何一个方法 发现它每次都只滑到了一半 今天终于解决了 解决方法如下 LinearLayoutManager linearLayoutManager LinearLayoutManager recycler
  • 【批量注册组件】

    自动的批量注册组件 大致步骤 使用 require 提供的函数 context 加载某一个目录下的所有 vue 后缀的文件 然后 context 函数会返回一个导入函数 importFn 它又一个属性 keys 获取所有的文件路径 通过文件
  • 不得不读

    本次总共收集了8位大牛的8篇精品文章 内容涉及设计 验证 行业研究 ICer职场生活等各方面 欢迎大家点击阅读并关注 1 酒酒拿下四五十万的真实大厂面试经历 作者介绍 酒酒成电研三在读 自学算法leetcode刷题 双修IC验证 斩获互联网
  • 程序中难以捉摸的错误如何自动检测?Parasoft Insure++ v2021.1发布!

    Parasoft Insure 是用于 C 和 C 应用程序的自动化运行时应用程序测试工具 可检测难以捉摸的错误 例如内存损坏 内存泄漏 内存分配错误 变量初始化错误 变量定义冲突 指针错误 库错误 I O 错误 和逻辑错误 Parasof
  • Python网络爬虫使用教程

    文章目录 一 URL资源抓取 1 urllib 2 requests 3 requests html 二 正则表达式 三 数据解析 1 Beautiful Soup 2 lxml 3 selectolax 四 自动化爬虫selenium 五
  • 汉字的区码和位码

    写于2016年12月08日 汉字的区码和位码 由于国标码是四位十六进制 为了便于交流 大家常用的是四位十进制的区位码 所有的国标汉字与符号组成一个94 94的矩阵 在此方阵中 每一行称为一个 区 每一列称为一个 位 因此 这个方阵实际上组成
  • 字典树实现_数据结构与算法之字典树(Golang实现)

    1 字典树 算法描述 trie树的本质 就是利用字符串之间的公共前缀 将重复的前缀合并在一起 时间复杂度 构建O n 查询O k 1 1 1 算法步骤 根节点 什么都不表示 做一个字典比如a z 字母表 没一个节点包含这26个字母的字典表
  • 基于pytorch卷积人脸表情识别--毕业设计

    基于卷积神经网络的人脸表情识别 前言 毕业设计内容介绍 卷积神经网络的设计 卷积网络的模型 卷积池化过程详细说明 第一层卷积池化过程 第二层卷积池化过程 第三层卷积池化过程 全连接层过程 模型的训练过程 卷积与池化原理 模型如何训练 模型的
  • C++字符串全排列(递归法)和(迭代法)以及next_permutation底层原理详解

    目录 前言 next permutation的使用 实现全排列的两种算法 1 递归法 全排列方便理解记忆的方法 作为备用方法 实现代码 无重复元素情况 有重复元素情况 2 迭代法 next permutation底层原理 实现代码 有无重复
  • 【Makefile】Makefile 中 LINUXINCLUDE 的作用

    在驱动开发的时候 我们经常会创建很多新的头文件 这些头文件大多以 include xxx h 的形式放在源码中 而内核头文件则是以 include
  • Excel的基本操作(新手必看)

    11 文本记忆输入 先定义前两行单元格的文字 在下面的单元格中 右键 从下拉列表中选择 那么会显示前面输入的内容 12 数据的有效性验证 方式1 点击空白单元格 数据 数据验证 允许中选择序列 在来源中以 英文逗号的形式 添加 列表 方式2
  • spring boot 启动流程

    计时器开始计时 headless模式赋值 发送ApplicationAStartingEvent 配置环境模块 发送ApplicationEnvironmentPreparedEvent 打印banner 创建上下文应用对象 初始化失败分析