SpringBoot运行流程源码分析:run方法流程及监听器
SpringBoot运行流程源码分析上一章中我们分析了 SpringApplication 类实例化的源代码 , 在此过程中完成了基本配置文件的加载和实例化 。 当 SpringApplication 对象被创建之后 ,通过调用其 run 方法来进行SpringBoot 的启动和运行 , 至此正式开启了 SpringApplication 的生命周期 。 本章介绍的内容同样是 Spring Boot 运行的核心流程之一 , 我们将会围绕 SpringApplicationRunListeners、ApplicationArguments、ConfigurableEnvironment 以及 应用上下文信息等部分展开讲解 。
run方法核心流程在分析和学习整个 run 方法的源代码及操作之前 , 我们先通过图 4-1 所示的流程图来看一下SpringApplication 调用的 run 方法处理的核心操作都包含哪些 。 然后 , 后面的章节我们再逐步细化分析每个过程中的源代码实现 。
文章插图
上面的流程图可以看出 , SpringApplication 在 run 方法中重 点做了以下操作 。
.获取监听器和参数配置 。
.打印 Banner 信息 。
.创建并初始化容器 。
监听器发送通知 。
当然 , 除了核心操作 , run 方法运行过程中还涉及启动时长统计、异常报告、启动日志、异常处理等辅助操作 。
对照流程图 , 我们再来整体看一下入口 run 方法的源代码 , 核心部分的功能已通过注释的形式进行说明 。
public ConfigurableApplicationContext run(String... args) {//创建 stopwatch 对象 ,用于统 i 计 run 方法启动时长StopWatch stopWatch = new StopWatch();//启动统计stopwatch.start();ConfigurableApplicationContext context = null;Collection except ionReporters = new Arraylist<>();//配置 headless 属性configureHeadlessProperty();//获得 SpringAppl icat ionRunL istener 数组//该数组封装 FSpringAppl icat ionRunL isteners 对象的 L isteners 中SpringApplicationRunListeners listeners = getRunListeners(args);//启动监听 , 遍历 SpringAppl icat ionRunL istener 数组每个元素 , 并执行listeners .starting();try {创建 Appl icat ionArguments 对象ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);//加载属性配置 , 包括所有的配置属性(如: appl icat ion. properties 中和外部的属性配置)Conf igurableEnvironment environment = prepareEnvironment(listeners,applicationArguments);configureIgnoreBeanInfo( environment);//打 BannerBanner printedBanner = printBanner ( environment);//创建容器context = createApplicationContext();//异常报告器exceptionReporters = getSpringFactoriesInstances(Spr ingBootExcept ionReporter .class ,new Class[] { ConfigurableApplicat ionContext.class }, context);//准备容器 , 组件对象之间进行关联prepareContext(context, environment, listeners, applicationArguments, printedBanner);// 初始化容器refreshContext(context);//初始化操作之后执行 , 默认实现为空afterRefresh( context, applicationArguments);//停止时长统计stopWatch. stop();//打印启动日志if (this. logStartupInfo) {new StartupInfoLogger(this . mainApplicat ionClass).logStarted(getApplicationLog(), stopwatch);//通知监昕器:容器启动完成listeners . started( context);//调用 Appl icat ionRunner 和 CommandL ineRunner 的运行方法 。 callRunners (context, applicat ionArguments);} 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;}
在整体了解了整个 run 方法运行流程及核心代码后 , 下面我们针对具体的程进行讲解 。
SpringApplicationRunListener 监听器 监听器的配置与加载
让我们忽略 Spring Boot 计 时和统计的辅助功能 , 直接来看 SpringApplicationRunListeners获取和使用 SpringApplicationRunL isteners可以理解为一个 SpringApplicationRunListener的容器 , 它将 SpringApplicationRunListener 的集合以构造方法传入 ,并赋值给其 listeners成员变量 , 然后提供了针对 listeners 成员变量的各种遍历操作方法 , 比如 , 遍历集合并调用对应的 starting、started、 running 等方法 。
SpringApplicationRunListeners 的构建很简单 , 图 4-1 中调用的 getRunListeners 方法也只是调用了它的构造方法 。 SpringApplication 中 getRunListeners 方法代码如下 。
private SpringApplicationRunListeners getRunListeners(String[] args) {//构造 Class 数组Class>[] types = new Class>[] { SpringApplication. class, String[].cla/调用 SpringAppl icat ionRunL isteners 构造方法return new SpringApplicationRunListeners(logger, getSpringFactoriesInstancesSpringApplicationRunListener .class, types, this, args));}SpringApplicationRunListeners 构 造 方 法 的 第 二 个 参 数 便 是 SpringApplicationRunListener 的 集 合,SpringApplication 中 调 用 构 造 方 法 时 该 参 数 是 通 过getSpringFactoriesInstances 方法获取的 , 代码如下 。 privateCollection getSpringF actoriesInstances(Class type,Class
- Python|小米 CyberDog 机器人将运行 Ubuntu 操作系统
- 华为鸿蒙系统|牛!龙芯二进制翻译功能,可运行安卓、windows、linux软件
- 控制器|超火的4款电脑端流程图工具,总有适合你的!
- |听歌如何赚钱,怎么一天拿100左右,简单流程
- swift|无需 Xcode,iPad 也能包办开发、提交 Swift 应用的全流程
- Linux|Linux一个有点神奇的后台运行命令
- spring|CPython 主分支通过 WebAssembly 在浏览器中运行
- 生产线|三星已有两条LCD生产线转向OLED,仅牙山LCD生产线仍在运行
- 调度|国内首个网地一体虚拟电厂平台试运行
- 华为|\华为5G手机\重生!首款新机曝光:外观原汁原味,运行安卓系统!