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揭秘》
Spring Boot中,可以通过自定义事件来实现在特定情况下触发一些自定义的逻辑或功能。下面是一个演示如何调用自定义事件的例子: 首先,我们需要定义一个自定义事件类,例如`CustomEvent`,该类需要继承`ApplicationEvent`: ```java public class CustomEvent extends ApplicationEvent { private String message; public CustomEvent(Object source, String message) { super(source); this.message = message; } public String getMessage() { return message; } } ``` 然后,我们需要定义一个事件发布者类,例如`CustomEventPublisher`,该类负责发布自定义事件: ```java @Component public class CustomEventPublisher { @Autowired private ApplicationEventPublisher applicationEventPublisher; public void publishCustomEvent(String message) { CustomEvent customEvent = new CustomEvent(this, message); applicationEventPublisher.publishEvent(customEvent); } } ``` 接下来,我们可以在需要的地方注入`CustomEventPublisher`,并调用`publishCustomEvent`方法来发布自定义事件: ```java @Service public class MyService { @Autowired private CustomEventPublisher customEventPublisher; public void doSomething() { // 执行一些业务逻辑 // ... // 发布自定义事件 customEventPublisher.publishCustomEvent("Custom event message"); } } ``` 最后,我们需要定义一个事件监听器类,例如`CustomEventListener`,该类负责监听并处理自定义事件: ```java @Component public class CustomEventListener implements ApplicationListener<CustomEvent> { @Override public void onApplicationEvent(CustomEvent customEvent) { // 处理自定义事件 String message = customEvent.getMessage(); System.out.println("Received custom event with message: " + message); } } ``` 通过以上步骤,我们就可以在Spring Boot中调用自定义事件了。当`MyService`中的`doSomething`方法被调用时,会触发自定义事件发布,然后`CustomEventListener`会监听到该事件并进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值