Spring-自定义事件发布

自定义事件发布

javaSE提供了实现自定义事件发布功能的基础类,即java.util.EventObject类和java.util.EventListener接口。所有的自定义事件类型可以通过扩展EventObject来实现,而事件的监听器则扩展自EventListener。

给出自定义事件类型

为了针对具体场景可以区分具体的事件类型,我们需要给出自己的事件类型的定义,通常的做法就是扩展java.util.EventObject类来实现自定义的事件类型。

实现针对自定义事件类的事件监听器接口

自定义的事件监听器需要在合适的时机监听自定义事件。事件监听器接口定义首先继承了java.util.EventListener.然后针对不同的事件发布时机提供相应的处理方法定义。最主要的就是,这些处理方法所接受的参数就是methodExecutionEvent类型的事件。也就是说,我们的自定义事件监听器类只负责监听其对应的自定义事件并进行处理。

组合事件类和监听器、发布事件

有了自定义事件和自定义事件监听器,剩下的就是发布事件,然后让相应的监听器听并处理事件了。通常情况下,我们会有一个事件发布者,他本身作为事件源,会在合适的时间点,将相应事件发布给对应的事件监听器。

具体时间点上自定义事件的发布

方法methodToMonitor()是事件发布的源头,MethodExeuctionEventPublisher在该方法开始和即将结束的时候,分别针对这两个时点发布MethodExecutionEvent事件。具体实现上,每个时点发布的时间会通过MethodExecutionListener的相应方法传给注册的监听者并被处理掉。注意,为了避免事件处理期间事件监听器的注册或移除操作影像处理过程,我们对事件发布时点的监听器列表进行了一个安全复制。另外,事件的发布是顺序执行,所以为了能够不影响处理性能,事件监听器的处理逻辑应该尽量简短。

自定义事件监听器的管理

MethodExecutionEventPublisher类提供了与事件监听器的注册和移除相关的方法,这样,客户端可以根据情况决定是否需要注册或者移除某个事件监听器。注意,这里边容易出现的问题:如果没有提供remove事件监听器的方法,那么注册的事件监听器实例会一直被MethodExecutionEventPublisher引用,即使已经过期了或者废弃不用了,也依然存在于MethodExecutionEventPublisher的监听器列表中。这样的话就会导致隐性的内存泄漏,在任何事件监听器的处理上都可能出现这样的问题。

整个java SE中的标准的自定义事件实现基本上涉及三个角色,自定义的事件类型、自定义的事件监听器和自定义的事件发布者。

本博客参考自王福强的《Spring揭秘》

时间: 2024-07-30 22:27:17

Spring-自定义事件发布的相关文章

spring 自定义事件发布及监听(简单实例)

前言: Spring的AppilcaitionContext能够发布事件和注册相对应的事件监听器,因此,它有一套完整的事件发布和监听机制. 流程分析: 在一个完整的事件体系中,除了事件和监听器以外,还应该有3个概念: 1. 事件源:事件的产生者,任何一个event都必须有一个事件源: 2. 事件广播器:它是事件和事件监听器之间的桥梁,负责把事件通知给事件监听器: 3. 事件监听器注册表:就是spring框架为所有的监听器提供了一个存放的地方: 通过流程图,可以看出它们是如何各司其职的,如下: 其

Spring的事件发布机制

一:Spring的事件发布 ApplicationContext提供了针对Bean的事件传播功能,其中的主角是publishEvent()方法,通过这个方法可以将事件通知给系统内的监听器(需实现ApplicationListener接口). ApplicationContext这个接口,是Spring的上下文,通常获取Bean就需要这个接口,这个接口并不是直接继承于BeanFactory,其中最著名的是直接继承了ApplicationPublisher接口,这个接口查看源码可以发现:只有一个方法

Java Spring 自定义事件监听

ApplicationContext 事件 定义一个context的起动监听事件 import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextStartedEvent; public class EventStart implements ApplicationListener<ContextStartedEvent>{ @Override pub

spring boot 事件发布与接收

1.创建发布对象 LoginEvent 2.在要发布对象的地方注入 ApplicationEventPublisher @Autowired ApplicationEventPublisher publisher; 3.发布 : 调用publisher的publishEvent(Object event)方法 publisher.publishEvent(new LoginEvent()) 4.创建事件监听Component @Component public class LoginEventH

深入理解Spring的容器内事件发布监听机制

目录 1. 什么是事件监听机制 2. JDK中对事件监听机制的支持 2.1 基于JDK实现对任务执行结果的监听 3.Spring容器对事件监听机制的支持 3.1 基于Spring实现对任务执行结果的监听 4.Spring事件监听源码解析 4.1 初始化事件发布器流程 4.2 注册事件监听器流程 4.3 容器事件发布流程 5.总结 1. 什么是事件监听机制 在讲解事件监听机制前,我们先回顾下设计模式中的观察者模式,因为事件监听机制可以说是在典型观察者模式基础上的进一步抽象和改进.我们可以在JDK或

十一、Spring之事件监听

Spring之事件监听 ApplicationListener ApplicationListener是Spring事件机制的一部分,与抽象类ApplicationEvent类配合来完成ApplicationContext的事件机制. 如果容器中存在ApplicationListener的Bean,当ApplicationContext调用publishEvent方法时,对应的Bean会被触发.这一过程是典型的观察者模式的实现. 源码: @FunctionalInterface public i

Spring内置事件以及自定义事件

1. Spring内置的事件有哪些? Spring中的事件是一个 ApplicationEvent类的子类,由实现 ApplicationEventPublisherAware 接口的类发送,实现 ApplicationListener 接口的类监听. Spring中已经定义了一组内置事件,这些事件由ApplicationContext容器发出.(ContextRefreshedEvent.ContextStartedEvent.ContextStoppedEvent.ContextClosed

Spring 事件(2)- 自定义事件

Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Control – IOC) 理解依赖注入(DI – Dependency Injection) Bean XML 配置(1)- 通过XML配置加载Bean Bean XML 配置(2)- Bean作用域与生命周期回调方法配置 Bean XML 配置(3)- 依赖注入配置 Bean XML 配置(

Jquery 自定义事件实现发布/订阅

1 //用户点击logoff按钮时,广播一个自定义事件,给任何需要保存状态的感兴趣的观察者,然后导航到logoff页面 2 3 $('#logoff').click(function(){ 4 $.event.trigger("logoff");//广播一个事件 5 window.location = "logoff.php";//导航到新页面 6 });