Spring事件发布
Spring 事件发布
Author: xiaolu
概要:
Spring的ApplicationContext在BeanFactory的基础上,支持事件的发布(包括同步-默认,和异步事件)。
事件发布和事件监听处理本质上是观察者模式的一种使用方式。对于Spring事件的发布,包含三个部分: 事件实体、事件监听器、事件发布者。
事件实体:
事件实体定义了什么事件,同时包含了要传递的参数信息。Spring的事件发布中,自定义事件实体需要继承ApplicationEvent类。即所有的事件都是ApplicationEvent类的子类。
事件监听者:
事件监听者,即对某个事件感兴趣的部分,在特定事件发生后,需要去进行某种逻辑的处理。Spring中事件监听者需要实现ApplicationListener接口。在其onApplicationEvent函数中进行事件的处理。
事件发布者:
事件发布者即发布事件的部分,它推动了事件流程的开始。Spring中,事件的发布可以使用ApplicationContext类的publishEvent方法来进行发布。
代码示例:
1) Java配置部分(替代xml文件配置方式)
2) 事件定义
此处定义一个StartEvent事件,继承于ApplicationEvent
3) 事件监听者
通过泛型参数给出具体要监听的事件类型
4) 事件发布
通过ApplicationContext的publishEvent来发布事件。
在这里出现了EventUtils类,其实是可以通过第11行的context来发布事件,但是在web程序中,我们是无法直接获得ApplicationContext对象的。(这里是演示,因此直接new获取了ApplicationContext)。要发布事件,就需要有ApplicationContext对象。那么如何获取ApplicationContext对象呢?在Spring中,如果实现XAware接口,那么Spring在构造bean时,会将对应的X注入到这个Bean中,因此只需要实现ApplicationContextAware即可。
在这里,EventUtils类实现了ApplicationContextAware接口,因此Spring容器在构造EventUtils这个bean时,检测到其实现了ApplicationContextAware接口,因为会将ApplicationContext实例注入进来,我们就可以使用它来发布事件了。
还有一种方式是实现ApplicationEventPublisherAware接口,Spring会注入ApplicationEventPublisher类型对象,通过它来发布实现。(其实注入进来的对象就是ApplicationContext对象,因为ApplicationContext接口继承自ApplicationEventPublisher接口。
网上经常给出实现是实现ApplicationContextAware/ApplicationEventPublisherAware接口,来发布事件,其原因是:为了持有ApplicationContext对象。
事件的同步和异步:
以上的事件发布则是使用的同步方式,如果要使用异步方式,所谓异步方式就是事件发布后不用等待事件监听者执行完成就返回。其实现是事件监听者使用了新的线程而非发布线程来执行事件处理逻辑。
@Async 和 @EnableAsync
在事件监听类的处理方法上设置@Async标签,同时在配置文件(配置类)上加上@EnableAsync即可。
代码示例:
事件监听者:
配置类(配置文件)
在spring中实现了AsyncConfigurer接口,并提供了Executor,否则会抛出异常(在SpringBoot中则不用实现此接口)。
还有一种实现异步的方式:
如果觉得监听器实现ApplicationListener<Event>接口具有侵入性,也可以通过注解方式而不用去实现接口:
效果是一样的:
如果去掉@Async和@EnableAsync,则结果是:
可以看到都是使用的main主线程来执行(也即是在同一个线程中执行了事件的发布者和监听者的事件处理逻辑,自然是同步的)。
转载于:https://www.cnblogs.com/xiao-lu/p/9575537.html
Spring事件发布相关推荐
- Spring事件发布机制
目录 前言 一.事件驱动机制 二.Spring的事件发布机制 三.Spring事件使用实例 四.Spring事件驱动的实现原理 总结: 前言 在设计模式中有一种设计模式叫做观察者设计模式,观察者模式的 ...
- Spring IoC 源码系列(三)Spring 事件发布机制原理分析
在 IoC 容器启动流程中有一个 finishRefresh 方法,具体实现如下: protected void finishRefresh() {clearResourceCaches();init ...
- Spring事件发布与监听
最近算是把spring整体的又过了一遍,发现很多东西虽然用的多,但是有些思想理解的不够透彻,在此记录下, 顺便感叹下,spring源码看了大部分,这才没过多久又忘了 TnT . 一.事件监听相关概念介 ...
- Spring Boot使用ApplicationEvent来实现事件发布订阅功能(美女一个都不能少,都要通知到) - 第420篇
历史文章(累计400+篇文章) <国内最全的Spring Boot系列之一> <国内最全的Spring Boot系列之二> <国内最全的Spring Boot系列之三&g ...
- 【转载】SpringBoot 事件发布监听机制使用
前言 这一篇从应用角度来跟大伙讲讲 这个 spring 事件监听机制 ,顺便涉及到那些我认为大家应该一块了解的,我也会展开说说. 文章内容(包括不限于) : 1. 对比观察者模式 2. 应用场景的分析 ...
- spring中事件发布设计与实现
spring中的事件发布框架依赖于三个抽象,ApplicationEvent,ApplicationListener,ApplicationEventPublisher.ApplicationEven ...
- Spring的事件发布机制
一:Spring的事件发布 ApplicationContext提供了针对Bean的事件传播功能,其中的主角是publishEvent()方法,通过这个方法可以将事件通知给系统内的监听器(需实现App ...
- 深入理解Spring的容器内事件发布监听机制
前言 Spring 提供了 ApplicationContext 事件机制,可以发布和监听事件,这个特性非常有用. Spring 内置了一些事件和监听器,例如在 Spring 容器启动前,Spring ...
- Spring Event事件发布机制
使用Spring Event优雅实现业务需求. 文章目录 一. 什么是Spring Event 二. 为什么要用Spring Event 三. 使用Spring Event实现邮件发送 一. 什么是S ...
最新文章
- 脚印:关于错误编码的管理的一些思考
- html 自定义标签解析,Java解析Html自定义标签的属性
- HashMap 为什么在链表长度为 8 的时候转红黑树,为啥不能是 9 是 10?
- 更少的标签,更好的学习,谷歌半监督学习算法FixMatch
- Spring : Transaction源码解析
- 无限递归替换文件内的某个字符串
- ionic 上拉加载更多
- Linux音频驱动-PCM设备
- php排斥ajaxsubmit函数,jQuery中的ajaxSubmit详解
- RAW到底比JPG强在哪里
- 索尼电视未能找到服务器是怎么回事,索尼电视进行网络设置或尝试访问互联网内容时出现错误...
- 治近视的秘方!1000度近视降到只有200度,不知道有没有用,试试(转)
- 手工植锡、焊接BGA芯片
- 绿色版软件怎么添加鼠标右键菜单里
- cocos2d-x 添加启动数字输入法的功能
- 写一个函数,将一个字符串中的元音字母复制到另一字符串,然后输出。
- 用BQ30Z55替换BQ40Z50
- IC设计 — 同步FIFO和异步FIFO设计实现(一)
- svn checkout 出现异常,E210007:Cannot negotiate authentication mechanism
- centos镜像(阿里云centos镜像)