许昌建网站,alexa排名搜索,数字短链接生成,国内产品网站1688在Java中#xff0c;创建事件#xff08;Event#xff09;、事件监听器#xff08;EventListener#xff09;和事件发布#xff08;publishEvent#xff09;的工作原理涉及到观察者设计模式。这种设计模式用于实现对象之间的松耦合通信。事件#xff08;Event#xff… 在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, 可以直接发布事件*/Autowiredprivate 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*/AsyncEventListenerpublic void handlePaymentEvent(PaymentEvent paymentEvent) {PaymentVo paymentVo paymentEvent.getPaymentVo();// 处理支付成功业务System.out.println(Payment successful for paymentId: paymentVo.getPaymentId());}
}