Java 创建事件(Event)、事件监听器(EventListener)、事件发布(publishEvent)详解
在Java中,创建事件(Event)、事件监听器(EventListener)和事件发布(publishEvent)的工作原理涉及到观察者设计模式。这种设计模式用于实现对象之间的松耦合通信。事件(Event)相当于被观察对象,事件监听器(EventListener)相当于观察者。
(图片来源网络,侵删)
其中一个对象(事件源)维护一组依赖于它的对象(事件监听器),并在状态改变时通知它们。
一般的,事件发布或事件监听后处理逻辑应该都是异步不阻塞线程。可以在发布时间或者事件监听方法上面加上@Async注解
总体而言,整个调用过程是一个松耦合的事件驱动模型。支付服务和事件监听器之间没有直接的依赖关系,支付服务只需发布支付完成事件,而不需要关心谁在监听它。监听器则通过事件类型感知并响应事件,实现了对象之间的解耦。这种模式使得系统更加灵活、可扩展,并能更容易地实现事件驱动的业务逻辑。
事件源(Event Source)
事件源是指能够产生事件的对象,它是整个事件系统的起点。你可以把它理解为一个java对象类。
package com.xxxx.model; import lombok.Data; @Data public class PaymentVo { private String paymentId; public PaymentVo(String paymentId) { this.paymentId = paymentId; } }
事件对象(Event)
事件对象是包含了事件相关信息的类,用于在事件源和事件监听器之间传递数据。必须继承ApplicationEvent。
package com.xxxx.event; import com.xxxx.model.PaymentVo; import org.springframework.context.ApplicationEvent; public class PaymentEvent extends ApplicationEvent { private PaymentVo paymentVo; public PaymentEvent(PaymentVo paymentVo) { super(paymentVo); } public PaymentVo getPaymentVo() { return paymentVo; } }
事件发布(publishEvent)
事件发布是指事件源对象发出事件的过程。一般使用ApplicationContext的publishEvent()方法。
package com.xxxx.service; import com.xxxx.event.PaymentEvent; import com.xxxx.model.PaymentVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.context.ApplicationContext; @Service public class PaymentService { /** * ApplicationContext 继承实现了 ApplicationEventPublisher, 可以直接发布事件 */ @Autowired private ApplicationContext applicationContext; public void processPayment(String paymentId) { // 执行支付逻辑 // 假设支付成功后,构造PaymentVo对象,并触发支付事件 PaymentVo paymentVo = new PaymentVo(paymentId); applicationContext.publishEvent(new PaymentEvent(paymentVo)); } }
事件监听器(EventListener)
当相应的事件被发布时,这些方法会被触发执行,处理事件相关的逻辑。使用 @EventListener 注解。(@EventListener工作原理-CSDN博客)
package com.xxxx.event; import com.xxxx.model.PaymentVo; import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; @Component public class EventListenerHandle { /** * EventListener 监听到PaymentEvent事件,触发方法 * @param paymentEvent */ @Async @EventListener public void handlePaymentEvent(PaymentEvent paymentEvent) { PaymentVo paymentVo = paymentEvent.getPaymentVo(); // 处理支付成功业务 System.out.println("Payment successful for paymentId: " + paymentVo.getPaymentId()); } }
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!