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

马肤

温馨提示:这篇文章已超过434天没有更新,请注意相关的内容是否还可用!

摘要:,,本文详细解释了Java中事件、事件监听器和事件发布的创建过程。介绍了事件的基本概念及其在Java中的应用。阐述了事件监听器的创建和作用,包括如何实现不同事件类型的监听。重点介绍了事件发布的过程,包括如何触发事件以及事件传播机制。本文帮助读者深入理解Java中的事件处理机制,为开发高效、灵活的Java应用程序提供指导。

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

Java 创建事件(Event)、事件监听器(EventListener)、事件发布(publishEvent)详解,Java事件、事件监听器与事件发布详解教程 第1张
(图片来源网络,侵删)

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

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

Java 创建事件(Event)、事件监听器(EventListener)、事件发布(publishEvent)详解,Java事件、事件监听器与事件发布详解教程 第2张
(图片来源网络,侵删)

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

事件源(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());
    }
}

0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码