springboot中ApplicationListener和SpringApplicationRunListener作用,区别,联系

深入分析SpringBoot下的事件/监听机制以及实现所有事件的异步处理 什么是事件/监听 监听/事件机制其实是由Spring实现的一种事件/监听器模式,可视为观察者模式。在Spring应用上下文ApplicationContext广播事件之后,监听器监听到后会做出相应事件的处理。 相应在SpringBoot中,在充分使用到Spring的ApplicationListener的同时也实现了SpringBoot的监听器SpringApplicationRunListe... 阅读详情

在 Spring Boot 中,ApplicationListener 和 SpringApplicationRunListener 是两个常见的接口,它们用于监听和处理应用程序的生命周期事件。虽然它们的功能上有一定的相似性,但它们设计的目标和使用场景是不同的。以下将详细解析它们的作用、区别以及联系。


1. ApplicationListener

作用

ApplicationListener 是 Spring 框架中的核心接口,用于监听特定类型的事件。例如,当 Spring 容器中发生了一些事件时(如上下文刷新、启动、关闭等),可以通过实现 ApplicationListener 接口来捕获并处理这些事件。

主要特点
  1. 基于事件机制

    • 它可以监听所有的 ApplicationEvent 以及其子类事件。
  2. 适用于容器层级的事件监听

    • 它关注的是 Spring 容器中发生的生命周期事件,例如 ContextRefreshedEvent, ContextClosedEvent 等。
  3. 实现方式

    • 通过实现 ApplicationListener 接口,可以在 onApplicationEvent 方法中处理事件。例如:

      public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent> {
          @Override
          public void onApplicationEvent(ContextRefreshedEvent event) {
              System.out.println("Spring Context Refreshed");
          }
      }
      
  4. 配置方式

    • 可以通过以下方式注册:
      • 直接通过 SpringApplication 注册(addListeners())。
      • 使用 @Component 或 XML 配置方式注册到 Spring 容器中。
优势
  • 简单易用,能处理 Spring 容器的事件,例如上下文加载完成、上下文关闭等。
  • 传统的 Spring 事件监听器机制支持,可灵活扩展。

2. SpringApplicationRunListener

作用

SpringApplicationRunListener 是 Spring Boot 特有的接口,它用于监听 SpringApplication 的启动过程中的事件和生命周期方法。它通常被用来在应用程序初始化的不同阶段插入一些逻辑。

主要特点
  1. 面向 SpringApplication 的生命周期管理

    • 它聚焦于 Spring Boot 应用启动的具体过程,并允许开发者在启动过程中定制逻辑。
  2. 启动过程中的关键阶段

    • 它监听的是 Spring Boot 应用程序启动的 5 个特定阶段。
      • starting():应用程序刚启动时触发。
      • environmentPrepared():Environment 已准备好,但还未创建 ApplicationContext 时触发。
      • contextPrepared():ApplicationContext 已创建,但还未刷新。
      • contextLoaded():ApplicationContext 已加载完成,但还未刷新。
      • started():ApplicationContext 已刷新,Spring Boot 应用启动完成。
      • running():应用程序已启动并运行。
      • failed():应用程序启动失败时触发。
  3. 实现方式

    • 可通过实现 SpringApplicationRunListener 接口并注册到 Spring Boot 的 spring.factories 文件中进行扩展。例如:

      public class MyRunListener implements SpringApplicationRunListener {
      
          public MyRunListener(SpringApplication application, String[] args) {
              // 构造函数
          }
      
          @Override
          public void starting() {
              System.out.println("SpringApplication is starting");
          }
      
          @Override
          public void environmentPrepared(ConfigurableEnvironment environment) {
              System.out.println("Environment is prepared");
          }
      
          @Override
          public void contextPrepared(ConfigurableApplicationContext context) {
              System.out.println("Context is prepared");
          }
          
          // 其他方法...
      }
      
  4. 配置方式

    • 需要在 META-INF/spring.factories 文件中注册:
      org.springframework.boot.SpringApplicationRunListener=\
      com.example.MyRunListener
      
优势
  • 提供对 Spring Boot 应用启动流程的全面监控和扩展能力。
  • 适用于对应用启动过程中底层细节的定制化需求。

3. 区别

特性ApplicationListenerSpringApplicationRunListener
引入版本Spring 核心框架Spring Boot 专属 (更高层次扩展)
作用范围容器层的事件,如 ApplicationContext 的生命周期事件SpringApplication 的生命周期事件
监听的事件类型ApplicationEvent 及其子类应用启动的固定阶段
使用场景监听容器事件(如上下文刷新、关闭等)定制 Spring Boot 启动过程的行为
注册方式在代码中显式注册或通过 Spring 自动发现(如注解)在 spring.factories 文件中指定
事件处理时机发生在 ApplicationContext 各种生命周期事件之后早于 ApplicationContext 的创建

4. 联系

  • SpringApplicationRunListener 和 ApplicationListener 都属于监听机制,用于监听生命周期中的某些重要事件。
  • 它们可以协同工作。例如:
    1. SpringApplicationRunListener 用于监听 Spring Boot 的启动阶段,并在某些阶段注入逻辑。
    2. ApplicationListener 用于接收来自容器生命周期的事件,扩展应用逻辑。
  • ApplicationEvent 的广播机制也可能被用在 SpringApplicationRunListener 中。

总结

  • ApplicationListener 更偏向 Spring 容器级别的事件监听,适用于监听容器初始化、刷新、关闭等事件。
  • SpringApplicationRunListener 专注于 Spring Boot 启动阶段的事件,它更低层和更细粒度。
  • 如果需要监听 Spring Boot 启动流程和容器生命周期,可以结合两者使用,达到对应用生命周期的全面扩展和自定义。
SpringBoot启动流程中的Initializer和Listeners 在上文分析SpringBoot的启动流程的这篇文章中,我们知道了SpringBoot启动大致需要分为两个阶段,第一个阶段就是实例化一个SpringApplication对象,第二个阶段就是调用这个对象的run()方法。 在SpringApplication的构造方法中,分别设置了Listeners和Initializers,我们今天的任务就是看看它俩是干啥的。 Initializers 1.定义 ... 阅读详情

相关推荐

面试官:说一下Spring Boot的启动过程吧!

介绍 Spring Boot相对于Spring在启动流程上来说并没有太大的区别,只是借助于SpringApplication将启动过程模版化了,并在其中增加了批量注册,自动装配的功能,并开放了一系列的扩展点 对了还有一个重要的区别,原来基于servlet的web应用,是由servlet容器如tomcat来启动spring容器,现在是spring容器来启动servlet容器 常见的扩展点有如下几种 SpringApplicationRunListener SpringApplicationRunListen.

小识的博客 5897

SpringApplicationRunListener详解

文章目录SpringApplicationRunListenerde 作用再次源码分析方法详解具体使用注意事项 SpringApplicationRunListenerde 作用 命名我们就可以知道它是一个监听者,分析springboot启动流程我们会发现,它其实是用来在整个启动流程中接收不同执行点事件通知的监听者,SpringApplicationRunListener接口规定了SpringBoot的生命周期,在各个生命周期广播相应的事件,调用实际的ApplicationListener类。 再次源码分析

你就像甜甜的益达 1万+

Spring高频面试基础问题与知识点整理

高频Spring相关基本面试题和知识点整理

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 174万+

Spring Boot-8-SpringBoot特有监听器SpringApplicationRunListener

Spring Boot在启动的整个过程中会有一些逻辑需要处理,实现的方式的就是通过监听器。Spring设计监听器的方式比较简洁,这里的监听器和Servlet的ServletContextListener没有什么关系。org.springframework.boot.SpringApplicationRunListener 始自Spring Boot 1.0.0 org.springframework.boot.SpringApplication run方法的监听器。所有的SpringApplicationR

诗人不写诗 3466

激光可燃气体传感器:核心技术环节分析

激光可燃气体传感器核心技术涵盖七个维度:1)TDLAS光谱吸收与调制技术(检测下限ppm级);2)DFB激光器与双闭环温控系统(波长稳定性±0.0036nm);3)微弱信号处理技术(信噪比提升60dB);4)环境补偿算法(温压补偿误差<±1%);5)本质安全防爆设计(ExiaIICT4Ga等级);6)智能边缘计算(STM32L476芯片);7)多重性能验证(响应时间<1秒)。通过微型化、多气体检测等创新,该技术已在工业安全等领域替代传统方案,实现高精度检测。(149字)

上市公司前技术负责人,20 年软硬件深耕 + 百人研发团队管理经验,名校理工科背景加持。从技术攻坚到团队掌舵,沉淀海量项目实战与管理心得,专注分享软硬件干货、疑难问题解决方案,既是靠谱知识传播者,也盼链接优质项目共成长。 1042

如何下载era5数据?(两种方式)

供水利大数据云计算课程同学参考使用#

Camiel_sweet的博客 1万+

SpringApplicationRunListener

SpringApplicationRunListener 接口的作用主要就是在Spring Boot 启动初始化的过程中可以通过SpringApplicationRunListener接口回调来让用户在启动的各个流程中可以加入自己的逻辑。 Spring Boot启动过程的关键事件(按照触发顺序)包括: 开始启动 Environment构建完成 ApplicationContext构建完成 ...

wonderfulwork 862

《C语言小游戏之贪吃蛇程序代码》

//为广大编程游戏爱好者提供一个参考的游戏源代码#include&lt;stdio.h&gt;#include&lt;conio.h&gt;#include&lt;windows.h&gt;#include&lt;time.h&gt;#define framex 5#define framey 5#define wide 20#define high 20int i,j,a[2];//将光标移动到...

qq_42052821的博客 2万+

死磕源码系列【SpringApplicationRunListener监听器源码及加载过程解析】

springboot提供了两个类SpringApplicationRunListeners、SpringApplicationRunListener(EventPublishingRunListener),spring框架还提供了一个ApplicationListener接口,那么这几个类或接口的关系又是如何呢?首先SpringApplicationRunListeners类是SpringApplicationRunListener接口的代理类,可以批量调用SpringApplicationRunList.

OceanSky的专栏 1332

带挂牵引车倒车运动模型推导及仿真实现

半挂牵引车在倒车时,由于鞍座主销的连接限制,其运动方式与乘用车有显著差异。例如,乘用车在右侧倒车入库时,只需确定泊车起点并将方向盘向右打死。相反,牵引车在倒车时需要先向左转方向盘,当铰接角达到防折叠的临界值时,再将方向盘向右转回,以调整牵引车与挂车至直线状态,完成泊车入库。本研究旨在建立一个基于牵引车带挂车倒车运动学模型,该模型基于以下假设: 道路在车辆行驶过程中保持平坦,无凹凸不平; 车辆以低速行驶,且在运行过程中车身不发生侧倾或俯仰; 行驶过程中,轮胎无变形,无侧向滑动,且不产

jianmo的博客 2697

【头歌educoder】离散数学实训参考-第二章-关系-part1-关系基础

python实现离散数学-关系基础-二元关系

wander_alice的博客 8464

SpringApplicationRunListener(运行监听器)

1、spring.factories # SpringApplicationRunListener org.springframework.boot.SpringApplicationRunListener=\ com.imooc.springapplication.run.HelloWorldSpringApplicationRunListener 2、HelloWorldSpringAp...

jiuweideqixu的博客 1349

MATLAB - 使用 RRT 进行挖掘机运动规划

本例演示了如何使用运动规划器在包含障碍物的环境中为挖掘机规划路径。在此示例中,您将以运动树的简化形式为挖掘机建模,然后使用基于采样的运动规划器确定挖掘机在存在障碍物的两个姿势之间的可行路径。在 Simscape™ 多体™ 模型中模拟结果。

机器人控制与仿真应用 1850

SpringBoot启动Debug笔记一 ———— 启动监听器

前言 从主启动类开始,进入下面这段代码: 所以这篇文章的主要部分就是这个红色框的部分。 一、EventPublishingRunListener.starting() @Override public void starting() { this.initialMulticaster.multicastEvent(new ApplicationStartingEvent(this.application, this.args)); } 此方法通过SimpleApplicationEventMu

hanxiexcellent的博客 410

【局部规划模块轨迹优化算法】EM_planner最大期望滚动优化算法

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对EM_planner最大期望滚动优化算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 760

Allegro格式PCB转换成Pads操作指导

变量:AEX_BIN_ROOT 值:D: MentorGraphics>PADSVX1.2>SDD_HOME>translators>win32bin (值:软件按装的位置,可以是9.5版本,也可以是VX1.0等不同的版本)。变量:HOME 值:C:Users>win7>AppData>Roaming>SPB_Data (这个值是allegro快捷键存放位置器,也可以随意放置在那个盘,我们可以采用默认的路径)。第4步:打开 PADSLayout软件,然后选择导入文件,选择刚刚处理的 allegro文件。

weixin_54787054的博客 3717

SpringBoot中ApplicationListener和SpringApplicationRunListener的区别

前言 最近在学习SpringBoot源码的时候发现了ApplicationListener和SpringApplicationRunListener两个监听器。一开始很容易将两个监听器混淆。以为都是SpringBoot的监听器。后面才发现他们是在不同的阶段被SpringBoot扫描并实例化的。 ApplicationListener加载详解 首先ApplicationListener是在SpringApplication类实例化的时候就加载的,Spring会从所有的spring.factories文件中加载

weixin_51110958的博客 2001

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SpringApplicationRunlistener和Applicationlistener区别

初始化 1. SpringApplicationRunListener属于应用程序启动层面的监听器,在springboot启动时候,调用run方法进行反射加载初始化。此时上下文还没有加载,如果通过@Compnant是起不了作用的。根据下图看下 springApplication.run()方法进入到getRunListeners(args)。 getRunListeners(args)方法进入到getSpringFactoriesInstances(…)方法(此处参数省略),继续走到SpringFa

qq_40204976的博客 3696

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SpringBoot扩展点之一:SpringApplicationRunListener

三种监听器的关系 ApplicationListener、SpringApplicationRunListeners、SpringApplicationRunListener的关系: SpringApplicationRunListeners类和SpringApplicationRunListener类是SpringBoot中新增的类。ApplicationListener是spring中...

weixin_30381793的博客 467

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

03、springboot启动时执行:@PostConstruct 、CommandLineRunner、ApplicationRunner、ApplicationListener对比

springboot启动时执行:CommandLineRunner、ApplicationRunner、ApplicationListener @PostConstruct 对比 使用场景: 我们在开发过程中会有这样的场景:需要在项目启动后执行一些操作,比如:读取配置文件信息,数据库连接,删除临时文件,清除缓存信息,工厂类初始化,加载活动数据,或者缓存的同步等。我们会有多种的实现方式,例如@PostConstruct 、CommandLineRunner、ApplicationRunner、Applicat

ડUN的博客 956

SpringBoot启动过程之初始化器initializer和监听器listeners

参考https://my.oschina.net/xiaoqiyiye/blog/1624181 SpringBoot初始化器和监听器        https://www.cnblogs.com/zhangxiaoguang/p/spring-notification.html Spring事件机制        http://jinnianshilongnian.iteye.com/blog/...

Bob_666的博客 6015

spring event事件(一)介绍与实现

当某个事件触发的时候,就会执行的方法块。当然,springboot很贴心地提供了一个注解来实现监听。自定义事件return msg;@Slf4j@Component@Overridelog.info("监听到 ContextRefreshedEvent...");log.info("监听到 MyEvent...");System.out.println("时间:" + myEvent.getTime() + " 信息:" + myEvent.getMsg());

w_t_y_y的博客 2199

SpringBoot 核心笔记

SpringBoot 是简化 Spring 开发的一站式框架,是整个 Spring 技术栈的整合。传统Spring开发需要大量XML配置,而SpringBoot通过自动配置、场景启动器starter,极大减少配置工作。微服务架构的流行也离不开SpringBoot作为基础开发框架。微服务(Martin Fowler,2014):将单体应用拆分为一组小型独立服务,服务之间通过HTTP通信;每个功能元素是可独立替换、独立升级的单元。单体应用:All In One,所有功能打包在一个应用中。日志实现。

estrusKing的博客 237

简单聊聊 SpringBoot 框架执行源码

一条主线构造收集 SPI → 准备环境(加载配置) → 创建空容器 → 填充上下文 → refresh(解析配置类 + 条件装配 + 启动 Tomcat + 实例化单例) → 发布就绪事件 → 执行 Runner。三个扩展点(refresh 前改容器)、(监听启动全生命周期事件)、(就绪后执行一次性逻辑)。面试时先画事件时间线 + refresh 12 步,再把"自动装配在哪步、Tomcat 在哪步"钉到具体步骤上,基本就聊透了。

weixin_47626220的博客 489

Spring源码:SpringBoot启动流程分析

通过百度网盘分享的文件:链接:https://pan.baidu.com/s/1fnt5fWSBLY7UfFPoZFyZpQ?pwd=gyg1 提取码: 按着按键点击方法:继续按着按键点击方法:继续按着按键点击构造方法:继续按着按键点击构造方法:我们逐步来分析SpringApplication构造方法中具体在什么事情::resourceLoader是null,所以赋值也是null:将主启动类放到集合中,后续会使用到,知道有这么回事就行,看到时再提一下:获取当前的web环境,即使用还是,我们使用环境 :往中放

qq_42449963的博客 1080

Spring Boot启动扩展点全梳理,掌握这些你也能写出高级starter

掌握Spring Boot启动扩展点,轻松实现定制化初始化逻辑。本文系统梳理Spring Boot 的启动过程中的核心扩展机制,涵盖ApplicationContextInitializer、ApplicationRunner等关键接口的应用场景与实战技巧,帮助开发者高效编写高级starter组件。值得收藏

PixelStream的博客 852
下一篇: 作为一名程序员,为什么我最终选择了“小白玩具”WordPress搭建个人网站?——我的建站心路历程
JavaObjects
博客等级 码龄7年 1粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值