6 Matching Annotations
- Feb 2025
-
Local file Local file
-
整个Java SE中标准的自定义事件实现就是这个样子,基本上涉及三个角色,即自定义的事件类型、自定义的事件监听器和自定义的事件发布者,关系如图5-4所示
自定义事件发布类结构图
-
在实现中,需要注意到,为了避免事件处理期间事件监听器的注册或移除操作影响处理过程,我们对事件发布时点的监听器列表进行了一个安全复制(safe-copy)。
我并不清楚,这个处理为什么能生效?
-
组合事件类和监听器,发布事件。有了自定义事件和自定义事件监听器,剩下的就是发布事件,然后让相应的监听器监听并处理事件了。通常情况下,我们会有一个事件发布者(EventPublisher),它本身作为事件源,会在合适的时点,将相应事件发布给对应的事件监听器。
在代码中,我们会看到,一个事件发布者的角色内含了一个事件监听器列表。同时实现了一个方法执行到监听器的方法,进而触发事件发布方法,以及管理事件监听器的方法。
-
代码清单5-13 自定义事件监听器MethodExecutionEventListener定义 2public interface MethodExecutionEventListener extends EventListener {/**3* 处理方法开始执行的时候发布的MethodExecutionEvent事件*/void onMethodBegin(MethodExecutionEvent evt);/**4* 处理方法执行将结束时候发布的MethodExecutionEvent事件*/void onMethodEnd(MethodExecutionEvent evt);5}事件监听器接口定义首先继承了java.util.EventListener,然后针对不同的事件发布时机提供相应的处理方法定义,最主要的就是,这些处理方法所接受的参数就是MethodExecutionEvent类型的事件。也就是说,我们的自定义事件监听器类只负责监听其对应的自定义事件并进行处理
事件监听器接口应该继承EventListener,实现该接口的类仅仅处理目标事件类
-
代码清单5-12 针对方法执行事件的自定义事件类型定义public class MethodExecutionEvent extends EventObject {private static final long serialVersionUID = -71960369269303337L;private String methodName;public MethodExecutionEvent(Object source) {super(source);}public MethodExecutionEvent(Object source,String methodName){super(source);this.methodName = methodName;}public String getMethodName() {return methodName;}public void setMethodName(String methodName) {this.methodName = methodName;}}我们想对方法的执行情况进行发布和监听,所以,就声明了一个MethodExecutionEvent类型,它继承自EventObject,当该类型的事件发布之后,相应的监听器即可对该类型的事件进行处理。如果需要,自定义事件类可以根据情况提供更多信息,不用担心自定义事件类的“承受力”。
创建一个自定义事件的做法,关键在于继承的类。以及其中的serialVersionUID。
-
Spring的ApplicationContext容器提供的容器内事件发布功能,是通过提供一套基于Java SE标准自定义事件类而实现的。
自定义事件要继承于EventObject;而自定义事件监听类要实现继承于EventListener接口的自定义监听器接口类。
-