自定义事件发布
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揭秘》