SpringBoot运行流程源码分析:run方法流程及监听器( 三 )
SpringApplicationRunListener 源码解析
接口 SpringApplicationRunListener 是 SpringApplication 的 run 方法监听器 。 上节提到了SpringApplicationRunListener 通过 SpringFactoriesL oader 加载 , 并且必须声明一个公共构造函数 , 该函数接收 SpringApplication 实例和 String[ ]的参数 , 而且每次运行都会创建一个新的实例 。
SpringApplicationRunListener 提供了-系列的方法 , 用户可以通过回调这些方法 , 在启动各个流程时加入指定的逻辑处理 。 下面我们对照源代码和注释来了解一下该接口都定义了哪些待实现的方法及功能 。
public interface SpringApplicationRunL istener {// 当 run 方法第- 次被执行时 , 会被立即调用 , 可用于非常早期的初始化工作 default voidstarting(){};//当 environment 准备完成 ,在 Appl icationContext 创建之前 ,该方法被调用 default voidenvironmentPrepared(Conf igurableEnvironment environment) {};//当 ApplicationContext 构建完成 ,资源还未被加载时 ,该方法被调用 default voidcontextPrepared(ConfigurableApplicationContext context) {}// 当 Appl icat ionContext 加 载 完 成,未 被 刷 新 之 前,该 方 法 被 调 用 default voidcontextLoaded(ConfigurableApplicationContext context) {};//当 ApplicationContext 刷新并启动之后, CommandL ineRunner 和 Appl icat ionRunner 未被调用之前 ,该方法被调用default void started(Conf igurableApplicationContext context) {};//当所有准备工作就绪 , run 方法执行完成之前 ,该方法被调用default void running(ConfigurableApplicationContext context) {};//当应用程序出现错误时 , 该方法被调用default void failed(ConfigurableApplicationContext context, Throwable exception) {};}
我们通过源代码可以看出 , SpringApplicationRunListener 为 run 方法提供了各个运行阶段的监听事件处理功能 。 需要注意的是 , 该版本中的接口方法定义使用了 Java8 的新特性 , 方法已采用 default 声明并实现空方法体 , 表示这个方法的默认实现 , 子类可以直接调用该方法 , 也可以选择重写或者不重写 。
图 4-2 展示了在整个 run 方法的生命周期中 SpringApplicationRunListener 的所有方法所处的位置 , 该图可以帮助我们更好地学习 run 方法的运行流程 。 在前面 run 方法的代码中已经看到相关监听方法被调用 , 后续的源代码中也将涉及对应方法的调用 , 我们可参考此图以便理解和加深记忆 。
文章插图
实现类 EventPublishingRunListener
EventPublishingRunL istener 是 SpringBoot 中针对 SpringApplicationRunListener 接口的唯内建实现EventPublishingRunL istener使用内置的SimpleApplicationEventMulticaster来广播在上下文刷新之前触发的事件 。
默认情况下 , Spring Boot在初始化过程中触发的事件也是交由EventPublishingRunListener来代理实现的 。 EventPublishingRunListener 的构造方法如下 。
public EventPublishingRunListener(SpringApplication application, Stringargs) {this.application = application;this.args = args;//创建 SimpleAppl icat ionEventMulticaster/播器this . initialMulticaster = new SimpleApplicationEventMulticaster();//遍历 Appl icat ionL istener 并关联 S impleAppl icat ionEventMulticasterfor (ApplicationListener> listener : application. getListeners()) {this. initialMulticaster . addApplicationListener(listener);}
通过源代码可以看出 , 该类的构造方法符合 SpringApplicationRunListener 所需的构造方法参数要求 , 该方法依次传递了 SpringApplication 和 String[ ]类型 。 在构造方法中初始化了该类的 3 个成员变量 。
- 文件系统(02):基于SpringBoot管理Xml和CSV
- SpringBoot2.x入门到项目实战课程系列(第二章)
- 第2天 | 12天搞定Python,运行环境(详细步骤)
- SpringBoot集成Mybatis
- 大牛深入解析SpringBoot核心运行原理和运作原理源码
- SpringBoot写后端接口,看这一篇就够了
- 首届互联网营销师新职业峰会成功举行业运行规范组建仪式
- 美国跨境物流空运FBA双清到门是什么操作流程呢?
- 苹果M1运行Windows 10比微软Surface快2倍
- M1处理器MacBook Air:成功运行Windows版《巫师3》