java 事件驱动模型(事件发布和监听@EventListener)

2024-03-24 14:20

本文主要是介绍java 事件驱动模型(事件发布和监听@EventListener),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、需要了解的概念
1、Aware机制:
Spring 容器在创建 bean 的过程中,会检查 bean 是否实现了某些特定的 Aware 接口,如果实现了,则会在合适的时机调用相应的 setter 方法,将相关的对象注入到 bean 中。

2、ApplicationEvent:
是Spring框架中的一个核心类,它表示Spring应用中的事件。这个类基于观察者模式,为Bean与Bean之间的消息通信提供了支持,是业务解耦的一种实现。常用于标识继承的类为一个事件类。

3、ApplicationEventPublisherAware:
ApplicationEventPublisherAware接口使得 bean 能够访问 Spring 的 ApplicationEventPublisher(事件发布者)。这个发布者允许 bean 发布应用事件,这些事件随后会被注册为监听器的其他 bean 接收。常用于定义发布事件的方法,给业务需要的地方进行调用。

二、代码示例
1、声明一个事件

import org.springframework.context.ApplicationEvent;
// 定义事件--如:邮件事件
public class EmailEvent extends ApplicationEvent {public EmailEvent(Object source) {super(source);}
}

2、定义事件的发布方法

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;// 定义发布事件方法,用于业务发布各种事件
@Component
public class EmailPublish implements ApplicationEventPublisherAware, ApplicationContextAware {// ApplicationEventPublisherAware实现了Aware接口,容器加载EmailPublish时,会促发Aware机制// 本例EmailPublish对象实现了ApplicationEventPublisherAware接口,所以在创建bean过程会调用setApplicationEventPublisher方法,setApplicationEventPublisher的入参ApplicationEventPublisher会自动从容器中传入,所以生成的DataEventPublish对象就包含了初始化好的applicationEventPublisher属性对象。// Spring 框架中的一个核心组件,俗称应用上下文,常用来获取和管理应用中的bean对象private ApplicationContext applicationContext;//  Spring 框架中的一个核心组件,它提供了事件发布的功能private ApplicationEventPublisher applicationEventPublisher;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.applicationEventPublisher = applicationEventPublisher;}// 生明发布邮件事件的方法public void publishEmail(Object source) {// applicationEventPublisher.publishEvent为向运行容器中发布事件,参数指定了发布什么类型的事件// 发布EmailEvent事件,监听EmailEvent事件的地方会被执行applicationEventPublisher.publishEvent(new EmailEvent(source));}}

3、调用发布

@Service
public class EventServiceImpl implements EventService {
@Autowired
private EmailPublish publish;@Overridepublic void testPublishEvent(EvDto evDto) {System.out.println("进入service");// 调用发布邮件的事件方法publish.publishEmail(evDto);}
}

4、监听事件,处理业务

import com.alibaba.fastjson.JSON;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
// 监听事件,实现业务
@Component
public class EmailPublishListener {@Transactional(propagation = Propagation.NEVER)@EventListener(classes = {EmailEvent.class})public void listenerEvent(EmailEvent event){System.out.println("进入邮件监听方法");Object source = event.getSource();System.out.println("调用的入参数据:"+ JSON.toJSONString(source));// 执行业务...}
}

思路:
定义事件–定义发布方法–定义监听方法–调用发布

三、优势
本例的事件驱动模型是一种典型的观察者设计模式,它使得组件之间的解耦更为容易,也使得代码更加灵活和可扩展。通过发布和监听事件,你可以在不直接依赖其他组件的情况下实现组件间的通信和协作。
优点:
1、解耦:观察者设计模式实现了观察者与被观察者之间的解耦,降低了两者之间的耦合关系。这使得两者可以各自独立地改变,而不需要对另一方进行大量的修改。
2、灵活性和可扩展性:由于观察者设计模式允许动态地添加或删除观察者,因此系统具有很好的灵活性和可扩展性。新的观察者可以很容易地添加到系统中,而无需修改被观察者的代码。
3、事件驱动:观察者设计模式基于事件驱动,当被观察者状态发生改变时,会自动通知所有注册的观察者。这种机制使得系统响应更加及时和准确。

学海无涯苦作舟!!!

这篇关于java 事件驱动模型(事件发布和监听@EventListener)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S