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

本文主要是介绍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, 可以直接发布事件*/@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*/@Async@EventListenerpublic void handlePaymentEvent(PaymentEvent paymentEvent) {PaymentVo paymentVo = paymentEvent.getPaymentVo();// 处理支付成功业务System.out.println("Payment successful for paymentId: " + paymentVo.getPaymentId());}
}

这篇关于Java 创建事件(Event)、事件监听器(EventListener)、事件发布(publishEvent)详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/489818

相关文章

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多