目录

Spring ApplicationListener 事件监听器

ApplicationEvent 自定义事件

ApplicationEvent 事件监听测试


Spring ApplicationListener 事件监听器

1、Spring ApplicationListener 事件监听器是 Spring 事件机制的一部分,与 ApplicationEvent 事件抽象类结合完成 ApplicationContext 的事件通知机制。

2、Spring ApplicationListener 是基于观测者设计模式的标准{java.util.EventListener}接口。如果容器中存在 ApplicationListener 的 Bean,当 ApplicationContext 调用 publishEvent 发布事件方法时,对应的 Bean 会被触发。

 @FunctionalInterfacepublic interface ApplicationListener<E extends ApplicationEvent> extends EventListener {/*** 处理应用程序事件* @param event:响应的事件*/void onApplicationEvent(E event);}

3、ApplicationEvent 抽象类有许多的子类和实现,支持自定义事件,其中 ApplicationContextEvent 子类专门为应用上下文提供了以下4个实现:

ContextStartedEvent 启动 ApplicationContext 时引发的事件。
ContextClosedEvent 关闭 ApplicationContext 时引发的事件。
ContextStoppedEvent 停止 ApplicationContext 时引发的事件。
ContextRefreshedEvent

初始化或刷新 ApplicationContext 时引发的事件。

此处的初始化是指所有的 Bean 被成功装载,ApplicationContext 容器已就绪可用。

4、下面以 ContextRefreshedEvent 事件监听进行演示:

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;/*** 当 ApplicationContext 被初始化或刷新时,触发 ContextRefreshedEvent 事件监听.* 1、应用程序启动时,Spring 会自动创建实例并放入到 Spring 容器中,此时就会初始化 ApplicationContext 应用上下文,* * 就会进入本类的 onApplicationEvent 方法,然后可以随意获取容器的中 bean 实例。* 2、ApplicationContext 刷新也是同理。** @author wangMaoXiong* @version 1.0* @date 2021/10/24 8:49*/
@Component
public class ContextRefreshedEventListener implements ApplicationListener<ContextRefreshedEvent> {/*** 处理应用程序事件** @param contextRefreshedEvent*/@Overridepublic void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {/*** long getTimestamp():返回事件发生时的系统时间(以毫秒为单位)* Object getSource():事件最初发生在其上的对象* ApplicationContext getApplicationContext():获取引发事件的应用上下文(ApplicationContext)* * 拥有了 ApplicationContext 之后就方便了,可以获取 Spring 容器中任意的 Bean 实例了.*/long timestamp = contextRefreshedEvent.getTimestamp();Object source = contextRefreshedEvent.getSource();ApplicationContext applicationContext = contextRefreshedEvent.getApplicationContext();/*** String getApplicationName():返回此上下文所属的已部署应用程序的名称。* String getId():返回此应用程序上下文的唯一id,如果没有,则返回 null* String getDisplayName():返回此上下文的显示名称(从不为 null)* T getBean(String name, Class<T> requiredType):返回指定bean的实例,该实例可以是共享的,也可以是独立的。* T getBean(Class<T> requiredType) :返回唯一匹配给定对象类型的bean实例(如果有)* * requiredType 可以是接口或超类,返回与所需类型匹配的单个bean的实例,如果找不到或找到多个,则都会抛异常。*/String applicationName = applicationContext.getApplicationName();String id = applicationContext.getId();String displayName = applicationContext.getDisplayName();System.out.println("id=" + id + "\tsource=" + source + "\tapplicationName=" + applicationName + "\tdisplayName=" + displayName);/*** String[] getBeanDefinitionNames():返回在此工厂中定义的所有bean的名称(如mvcPathMatcher),如果未定义,则返回空数组。*/String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();int count = 1;for (String beanDefinitionName : beanDefinitionNames) {System.out.println((count++) + "\t" + "timestamp=" + timestamp + "\tbeanDefinitionName=" + beanDefinitionName);}}
}

在线演示源码:https://gitee.com/wangmx1993/java-se/blob/master/src/main/java/org/example/listener/ContextRefreshedEventListener.java

ApplicationEvent 自定义事件

1、自定义用户登录事件,继承 {@link ApplicationEvent} 事件抽象类。

import org.springframework.context.ApplicationEvent;
import java.util.UUID;
/*** 自定义用户登录事件,继承 {@link ApplicationEvent} 事件抽象类** @author wangMaoXiong* @version 1.0* @date 2021/10/24 9:43*/
public class LoginEven extends ApplicationEvent {private String id = "0";private String message = "";/*** 创建一个新的 ApplicationEvent* 这个构造器是默认且必须创建的,必须将事件最初发生的对象 source 传递上去。** @param source:事件最初发生的对象或与事件关联的对象。值不能为 null,但是值也没有强制规定。*   可以参阅 {@link org.springframework.context.event.ContextRefreshedEvent}*   可以参阅 {@link org.springframework.context.event.ContextClosedEvent}*/public LoginEven(Object source) {super(source);}/*** 构造器传参** @param source  :事件最初发生的对象或与事件关联的对象。值不能为 null,但是值也没有强制规定。*                可以参阅 {@link org.springframework.context.event.ContextRefreshedEvent}*                可以参阅 {@link org.springframework.context.event.ContextClosedEvent}* @param id      :事件ID* @param message :事件消息*/public LoginEven(Object source, String id, String message) {super(source);id = id == null || "".equals(id) ? UUID.randomUUID().toString().replace("-", "") : id;this.id = id;this.message = message;}//省略 getter、setter、toString 方法
}

在线演示源码:https://gitee.com/wangmx1993/java-se/blob/master/src/main/java/org/example/listener/LoginEven.java

2、为自定义用户登录事件{@link LoginEven} 设置应用监听器。

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
/*** 为自定义用户登录事件{@link LoginEven} 设置应用监听器** @author wangMaoXiong* @version 1.0* @date 2021/10/24 9:54*/
@Component
public class LoginEvenListener implements ApplicationListener<LoginEven> {/*** 处理应用程序事件。* ApplicationContext.publishEvent(ApplicationEvent event) 每调用发布一次事件,本方法就会触发一次。** @param loginEven :自定义用户登录事件*/@Overridepublic void onApplicationEvent(LoginEven loginEven) {/*** long getTimestamp():返回事件发生时的系统时间(以毫秒为单位)*/long timestamp = loginEven.getTimestamp();System.out.println("发生用户登录事件(org.example.listener.LoginEven):" + timestamp + "\t" + loginEven);}
}

在线演示源码:https://gitee.com/wangmx1993/java-se/blob/master/src/main/java/org/example/listener/LoginEvenListener.java

ApplicationEvent 事件监听测试

1、直接启动应用测试也是一样的,这里通过测试类方法启动测试。

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;
/*** ApplicationEvent 事件监听测试** @author wangMaoXiong* @version 1.0* @date 2021/10/24 10:37*/
@SpringBootTest
@RunWith(SpringRunner.class)
public class ApplicationEventTest {@Autowiredprivate ApplicationContext applicationContext;/*** 测试{@link ContextRefreshedEventListener} 监听器* 应用启动就会自动注入 bean 到 Spring 容器会自动初始化,然后自动会触发 {@link ContextRefreshedEventListener} 监听器*/@Testpublic void testContextRefreshedEvent() {}/*** 测试自定义事件 {@link LoginEven}* void publishEvent(ApplicationEvent event):将应用程序事件通知所有注册到此应用程序的匹配的侦听器。* * 事件可以是框架事件(例如ContextRefreshedEvent)或特定于应用程序的自定义事件。*/@Testpublic void testLoginEven() {String loginName = "hangSan";LoginEven loginEven = new LoginEven("loginEven", null, loginName);applicationContext.publishEvent(loginEven);loginName = "LiSi";loginEven = new LoginEven("loginEven", null, loginName);applicationContext.publishEvent(loginEven);}
}

在线演示源码:https://gitee.com/wangmx1993/java-se/blob/master/src/main/java/org/example/listener/ApplicationEventTest.java

Spring ApplicationListener 事件监听器,能监听容器中所有实例相关推荐

  1. Spring事件发布与监听

    最近算是把spring整体的又过了一遍,发现很多东西虽然用的多,但是有些思想理解的不够透彻,在此记录下, 顺便感叹下,spring源码看了大部分,这才没过多久又忘了 TnT . 一.事件监听相关概念介 ...

  2. springboot—监听容器启动事件—拦截器及注册

    1.监听容器启动事件 2.拦截器

  3. ActiveMQ学习总结(10)——ActiveMQ采用Spring注解方式发送和监听

    对于ActiveMQ消息的发送,原声的api操作繁琐,而且如果不进行二次封装,打开关闭会话以及各种创建操作也是够够的了.那么,Spring提供了一个很方便的去收发消息的框架,spring jms.整合 ...

  4. TP6 事件绑定、监听、订阅

    事件绑定与监听 命令行生成事件类 php think make:event EventDemo 命令行生成事件监听类php think make:listener ListenerDemo 事件类可作 ...

  5. php subscribe event,TP6 事件绑定、监听、订阅

    事件绑定与监听 命令行生成事件类 php think make:event EventDemo 命令行生成事件监听类php think make:listener ListenerDemo 事件类可作 ...

  6. spring boot+kafka+canal实现监听MySQL数据库

    spring boot+kafka+canal实现监听MySQL数据库 一.zookeeper安装 kafka依赖于zookeeper,安装kafka前先安装zookeeper 下载地址:Apache ...

  7. 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用

    转载:http://blog.csdn.net/5iasp/article/details/37054171 谢谢博主 ======================================== ...

  8. 多线程消息监听容器配置[ 消费者spring-kafka配置文件]

    1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://ww ...

  9. java实现分发_关于JAVA中事件分发和监听机制实现的代码实例

    [实例简介] 关于JAVA中事件分发和监听机制实现的代码实例,绝对实用代码,有说明. [实例截图] [核心代码] JavaEventDispatch ├── bin │   └── com │   └ ...

  10. 本地mysql无法监听_查询数据库出错,监听器无法监听

    查询数据库出错,监听器无法监听0 a.jsp 项目组在岗员工统计表 项目组名 显示全部 本地人员 出差人员 总计 大连外包 request.setCharacterEncoding("gb2 ...

最新文章

  1. UVA 10306 e-Coins(全然背包: 二维限制条件)
  2. 三本毕业后,我进入了世界五百强
  3. android中的显示跳转和隐式跳转
  4. JavaScript 技术篇-js检测原生对象类型实例演示,js的3种对象类型
  5. 玩吧高速增长的数据上云实践
  6. Elasticsearch--进阶-match_phrase短语匹配---全文检索引擎ElasticSearch工作笔记012
  7. Managing the Activity Lifecycle
  8. LeetCode 98 验证二叉搜索树
  9. 细聊一下我面试Java开发人员的3条面试标准
  10. 10.27T1 堆贪心
  11. 性能测试学习线路图(建议)
  12. 深度剖析 C++ 对象池自动回收技术实现
  13. 机器视觉光源知识总结(二)
  14. 2014全国计算机二级visual foxpro,全国计算机等级考试二级visual_foxpro试题
  15. 阿里云平台购买域名 免费申请SSL证书
  16. win10创建系统还原点
  17. ctrlaltdel命令手册
  18. python实现文件重命名_python实现文件重命名
  19. 【python】蓄水池
  20. 市场营销书籍推荐:《经理人参阅:市场营销》

热门文章

  1. Android类参考---Fragment(二)
  2. C语言内存地址对齐详解
  3. SendMessage函数完全使用手册 (转)
  4. NHibernate,我越看越傻了.........
  5. 排序算法--选择排序
  6. 再谈 最速下降法/梯度法/Steepest Descent
  7. java outputstrea_java的InputStream和OutputStream的理解【转】
  8. 【C/C++】C++基本语法
  9. java整型_java整型数值
  10. Ubuntu16.04安装python3.6导入requests/aiohttp/httpx等网络请求模块报错ModuleNotFoundError: No module named ‘_ssl‘