Spring ApplicationListener 事件监听器,能监听容器中所有实例
目录
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 事件监听器,能监听容器中所有实例相关推荐
- Spring事件发布与监听
最近算是把spring整体的又过了一遍,发现很多东西虽然用的多,但是有些思想理解的不够透彻,在此记录下, 顺便感叹下,spring源码看了大部分,这才没过多久又忘了 TnT . 一.事件监听相关概念介 ...
- springboot—监听容器启动事件—拦截器及注册
1.监听容器启动事件 2.拦截器
- ActiveMQ学习总结(10)——ActiveMQ采用Spring注解方式发送和监听
对于ActiveMQ消息的发送,原声的api操作繁琐,而且如果不进行二次封装,打开关闭会话以及各种创建操作也是够够的了.那么,Spring提供了一个很方便的去收发消息的框架,spring jms.整合 ...
- TP6 事件绑定、监听、订阅
事件绑定与监听 命令行生成事件类 php think make:event EventDemo 命令行生成事件监听类php think make:listener ListenerDemo 事件类可作 ...
- php subscribe event,TP6 事件绑定、监听、订阅
事件绑定与监听 命令行生成事件类 php think make:event EventDemo 命令行生成事件监听类php think make:listener ListenerDemo 事件类可作 ...
- spring boot+kafka+canal实现监听MySQL数据库
spring boot+kafka+canal实现监听MySQL数据库 一.zookeeper安装 kafka依赖于zookeeper,安装kafka前先安装zookeeper 下载地址:Apache ...
- 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用
转载:http://blog.csdn.net/5iasp/article/details/37054171 谢谢博主 ======================================== ...
- 多线程消息监听容器配置[ 消费者spring-kafka配置文件]
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://ww ...
- java实现分发_关于JAVA中事件分发和监听机制实现的代码实例
[实例简介] 关于JAVA中事件分发和监听机制实现的代码实例,绝对实用代码,有说明. [实例截图] [核心代码] JavaEventDispatch ├── bin │ └── com │ └ ...
- 本地mysql无法监听_查询数据库出错,监听器无法监听
查询数据库出错,监听器无法监听0 a.jsp 项目组在岗员工统计表 项目组名 显示全部 本地人员 出差人员 总计 大连外包 request.setCharacterEncoding("gb2 ...
最新文章
- UVA 10306 e-Coins(全然背包: 二维限制条件)
- 三本毕业后,我进入了世界五百强
- android中的显示跳转和隐式跳转
- JavaScript 技术篇-js检测原生对象类型实例演示,js的3种对象类型
- 玩吧高速增长的数据上云实践
- Elasticsearch--进阶-match_phrase短语匹配---全文检索引擎ElasticSearch工作笔记012
- Managing the Activity Lifecycle
- LeetCode 98 验证二叉搜索树
- 细聊一下我面试Java开发人员的3条面试标准
- 10.27T1 堆贪心
- 性能测试学习线路图(建议)
- 深度剖析 C++ 对象池自动回收技术实现
- 机器视觉光源知识总结(二)
- 2014全国计算机二级visual foxpro,全国计算机等级考试二级visual_foxpro试题
- 阿里云平台购买域名 免费申请SSL证书
- win10创建系统还原点
- ctrlaltdel命令手册
- python实现文件重命名_python实现文件重命名
- 【python】蓄水池
- 市场营销书籍推荐:《经理人参阅:市场营销》
热门文章
- Android类参考---Fragment(二)
- C语言内存地址对齐详解
- SendMessage函数完全使用手册 (转)
- NHibernate,我越看越傻了.........
- 排序算法--选择排序
- 再谈 最速下降法/梯度法/Steepest Descent
- java outputstrea_java的InputStream和OutputStream的理解【转】
- 【C/C++】C++基本语法
- java整型_java整型数值
- Ubuntu16.04安装python3.6导入requests/aiohttp/httpx等网络请求模块报错ModuleNotFoundError: No module named ‘_ssl‘