使用了Spring的事件机制真香!
前言本文主要是简单的讲述了Spring的事件机制,基本概念,讲述了事件机制的三要素事件、事件发布、事件监听器 。如何实现一个事件机制,应用的场景,搭配@Async注解实现异步的操作等等 。希望对大家有所帮助 。
Spring的事件机制的基本概念Spring的事件机制是Spring框架中的一个重要特性,基于观察者模式实现,它可以实现应用程序中的解耦,提高代码的可维护性和可扩展性 。Spring的事件机制包括事件、事件发布、事件监听器等几个基本概念 。其中,事件是一个抽象的概念,它代表着应用程序中的某个动作或状态的发生 。事件发布是事件发生的地方,它负责产生事件并通知事件监听器 。事件监听器是事件的接收者,它负责处理事件并执行相应的操作 。在Spring的事件机制中,事件源和事件监听器之间通过事件进行通信,从而实现了模块之间的解耦 。
举个例子:用户修改密码,修改完密码后需要短信通知用户,记录关键性日志,等等其他业务操作 。
如下图,就是我们需要调用多个服务来进行实现一个修改密码的功能 。
【使用了Spring的事件机制真香!】

文章插图
使用了事件机制后,我们只需要发布一个事件,无需关心其扩展的逻辑,让我们的事件监听器去处理,从而实现了模块之间的解耦 。

文章插图
事件通过继承ApplicationEvent,实现自定义事件 。是对 JAVA EventObject 的扩展,表示 Spring 的事件,Spring 中的所有事件都要基于其进行扩展 。其源码如下 。
我们可以获取到timestamp属性指的是发生时间 。

文章插图
事件发布事件发布是事件发生的地方,它负责产生事件并通知事件监听器 。ApplicationEventPublisher用于用于发布 ApplicationEvent 事件,发布后 ApplicationListener 才能监听到事件进行处理 。源码如下 。
需要一个ApplicationEvent,就是我们的事件,来进行发布事件 。

文章插图
事件监听器ApplicationListener 是 Spring 事件的监听器,用来接受事件,所有的监听器都必须实现该接口 。该接口源码如下 。

文章插图
Spring的事件机制的使用方法下面会给大家演示如何去使用Spring的事件机制 。就拿修改密码作为演示 。
如何定义一个事件新增一个类,继承我们的ApplicationEvent 。
如下面代码,继承后定义了一个userId,有一个UserChangePasswordEvent方法 。这里就定义我们监听器需要的业务参数,监听器需要那些参数,我们这里就定义那些参数 。
/** * @Author JiaQIng * @Description 修改密码事件 * @ClassName UserChangePasswordEvent * @Date 2023/3/26 13:55 **/@Getter@Setterpublic class UserChangePasswordEvent extends ApplicationEvent {private String userId;public UserChangePasswordEvent(String userId) {super(new Object());this.userId = userId;}}
如何监听事件实现监听器有两种方法- 新建一个类实现ApplicationListener接口,并且重写onApplicationEvent方法 。注入到Spring容器中,交给Spring管理 。如下代码 。新建了一个发送短信监听器,收到事件后执行业务操作 。****
/** * @Author JiaQIng * @Description 发送短信监听器 * @ClassName MessageListener * @Date 2023/3/26 14:16 **/@Componentpublic class MessageListener implements ApplicationListener<UserChangePasswordEvent> {@Overridepublic void onApplicationEvent(UserChangePasswordEvent event) {System.out.println("收到事件:" + event);System.out.println("开始执行业务操作给用户发送短信 。用户userId为:" + event.getUserId());}}
- 使用 @EventListener 注解标注处理事件的方法,此时 Spring 将创建一个 ApplicationListener bean 对象,使用给定的方法处理事件 。源码如下 。参数可以给指定的事件 。这里巧妙的用到了@AliasFor的能力,放到了@EventListener身上 注意:一般建议都需要指定此值,否则默认可以处理所有类型的事件,范围太广了 。

文章插图
代码如下 。新建一个事件监听器,注入到Spring容器中,交给Spring管理 。在指定方法上添加@EventListener参数为监听的事件 。方法为业务代码 。使用 @EventListener 注解的好处是一个类可以写很多监听器,定向监听不同的事件,或者同一个事件 。
推荐阅读
- 使用Go语言进行开发的互联网公司
- 灭火器的使用方法口诀是什么
- 白衣天使,真的是一份神仙职业吗?
- 使用走珠液要注意什么
- 热水器省电的正确用法有哪些 热水器省电使用方法
- 秒表的使用 秒表的使用方法
- 十个很少使用的 JavaScript Console 方法
- 使用Java Reflection实现对象的动态操作与扩展
- Spring中Bean的作用域Scope你知道多少?如何自定义作用域?
- 如何使用Python构建一个抄袭检测系统?