当前位置:   article > 正文

Java 创建事件(Event)、事件监听器(EventListener)、事件发布(publishEvent)详解

eventlistener

在Java中,创建事件(Event)、事件监听器(EventListener)和事件发布(publishEvent)的工作原理涉及到观察者设计模式。这种设计模式用于实现对象之间的松耦合通信。事件(Event)相当于被观察对象,事件监听器(EventListener)相当于观察者。

其中一个对象(事件源)维护一组依赖于它的对象(事件监听器),并在状态改变时通知它们。

一般的,事件发布或事件监听后处理逻辑应该都是异步不阻塞线程。可以在发布时间或者事件监听方法上面加上@Async注解

总体而言,整个调用过程是一个松耦合的事件驱动模型。支付服务和事件监听器之间没有直接的依赖关系,支付服务只需发布支付完成事件,而不需要关心谁在监听它。监听器则通过事件类型感知并响应事件,实现了对象之间的解耦。这种模式使得系统更加灵活、可扩展,并能更容易地实现事件驱动的业务逻辑。

事件源(Event Source)

事件源是指能够产生事件的对象,它是整个事件系统的起点。你可以把它理解为一个java对象类。

  1. package com.xxxx.model;
  2. import lombok.Data;
  3. @Data
  4. public class PaymentVo {
  5. private String paymentId;
  6. public PaymentVo(String paymentId) {
  7. this.paymentId = paymentId;
  8. }
  9. }

事件对象(Event)

事件对象是包含了事件相关信息的类,用于在事件源和事件监听器之间传递数据。必须继承ApplicationEvent。

  1. package com.xxxx.event;
  2. import com.xxxx.model.PaymentVo;
  3. import org.springframework.context.ApplicationEvent;
  4. public class PaymentEvent extends ApplicationEvent {
  5. private PaymentVo paymentVo;
  6. public PaymentEvent(PaymentVo paymentVo) {
  7. super(paymentVo);
  8. }
  9. public PaymentVo getPaymentVo() {
  10. return paymentVo;
  11. }
  12. }

事件发布(publishEvent)

事件发布是指事件源对象发出事件的过程。一般使用ApplicationContext的publishEvent()方法。

  1. package com.xxxx.service;
  2. import com.xxxx.event.PaymentEvent;
  3. import com.xxxx.model.PaymentVo;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Service;
  6. import org.springframework.context.ApplicationContext;
  7. @Service
  8. public class PaymentService {
  9. /**
  10. * ApplicationContext 继承实现了 ApplicationEventPublisher, 可以直接发布事件
  11. */
  12. @Autowired
  13. private ApplicationContext applicationContext;
  14. public void processPayment(String paymentId) {
  15. // 执行支付逻辑
  16. // 假设支付成功后,构造PaymentVo对象,并触发支付事件
  17. PaymentVo paymentVo = new PaymentVo(paymentId);
  18. applicationContext.publishEvent(new PaymentEvent(paymentVo));
  19. }
  20. }

事件监听器(EventListener)

当相应的事件被发布时,这些方法会被触发执行,处理事件相关的逻辑。使用 @EventListener 注解。(@EventListener工作原理-CSDN博客)

  1. package com.xxxx.event;
  2. import com.xxxx.model.PaymentVo;
  3. import org.springframework.context.event.EventListener;
  4. import org.springframework.scheduling.annotation.Async;
  5. import org.springframework.stereotype.Component;
  6. @Component
  7. public class EventListenerHandle {
  8. /**
  9. * EventListener 监听到PaymentEvent事件,触发方法
  10. * @param paymentEvent
  11. */
  12. @Async
  13. @EventListener
  14. public void handlePaymentEvent(PaymentEvent paymentEvent) {
  15. PaymentVo paymentVo = paymentEvent.getPaymentVo();
  16. // 处理支付成功业务
  17. System.out.println("Payment successful for paymentId: " + paymentVo.getPaymentId());
  18. }
  19. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/588641
推荐阅读
相关标签
  

闽ICP备14008679号