Spring 框架——事件驱动模型

目录

  • 1.概述
  • 2.三种角色
    • 2.1.事件角色
    • 2.2.事件监听者角色
    • 2.3.事件发布者角色
  • 3.示例

1.概述

(1)Spring 事件驱动模型是 Spring 框架中的一种编程模型,也被称为发布/订阅模型,通过使用观察者模式事件机制,实现了组件之间基于事件的解耦和通信。在 Spring 中,事件驱动模型建立在应用上下文事件 (ApplicationContextEvent) 的基础上。应用上下文事件是一种用于描述应用状态改变的事件,如应用上下文初始化完成、上下文刷新、上下文关闭等。

(2)通过事件驱动模型,Spring 框架提供了更灵活、松散耦合的方式来实现组件之间的通信和解耦。开发者可以定义自己的事件,并通过事件监听器来处理,实现自定义的业务逻辑,扩展框架的行为,并能够更容易地实现可测试、可维护和可扩展的应用程序。

有关观察者模式的相关知识可以参考Java 设计模式——观察者模式。

2.三种角色

2.1.事件角色

(1)事件是系统中发生的特定动作或者状态的表示。它可以是一个普通的 Java 对象,通常包含与该事件相关的数据和信息。例如,一个用户注册事件可以包含用户的姓名、邮箱等信息。

(2)在 Spring 中,org.springframework.context 包下的抽象类 ApplicationEvent 充当了事件的角色,它继承了 java.util.EventObject 类。并且Spring 中默认存在以下 4 种事件,它们都是继承了 ApplicationContextEvent 类(该类继承自 ApplicationEvent):

  • ContextClosedEvent:表示应用程序上下文关闭事件,触发时机是在应用程序上下文关闭时;
  • ContextRefreshedEvent:表示应用程序上下文刷新事件,触发时机是在应用程序上下文初始化及刷新完成后
  • ContextStartedEvent:表示应用程序上下文启动事件,触发时机是在应用程序上下文启动时;
  • ContextStoppedEvent:表示应用程序上下文停止事件,触发时机是在应用程序上下文停止时;

(3)上述类之间的关系如下图所示:

在这里插入图片描述

2.2.事件监听者角色

接口 ApplicationListener 充当了事件监听者角色,其源码如下所示。该接口中定义了一个名为 onApplicationEvent() 的方法来处理事件 ApplicationEvent。因此,在 Spring 中我们只需该接口的 onApplicationEvent() 方法即可完成监听事件。

package org.springframework.context;import java.util.EventListener;@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {/*** Handle an application event.* @param event the event to respond to*/void onApplicationEvent(E event);
}

2.3.事件发布者角色

接口 ApplicationEventPublisher 充当了事件发布者角色,其源码如下所示。该接口中的 publishEvent() 方法的具体实现是在AbstractApplicationContext 类中,具体细节此处就不再过多描述,感兴趣的读者可以去阅读其源码。

package org.springframework.context;@FunctionalInterface
public interface ApplicationEventPublisher {default void publishEvent(ApplicationEvent event) {publishEvent((Object) event);}void publishEvent(Object event);
}

(2)在事件驱动模型中,发布者 (Publisher) 和订阅者 (Subscriber) 是模型的关键角色。发布者通过发布事件的方式进行通知,而订阅者通过订阅(订阅)事件的方式接收通知。发布者和订阅者之间的关系是松散耦合的,发布者不需要知道订阅者的具体细节,只需要发布事件,并由框架负责将事件传递给订阅者。

(3)在 Spring 框架中,应用上下文充当事件的发布者,而事件监听器 (Event Listener) 充当事件的订阅者。监听器可以通过实现 ApplicationListener 接口或使用 @EventListener 注解来订阅应用上下文事件。当事件被发布时,相应的监听器会接收到事件并执行相应的逻辑,实现事件驱动的编程。

3.示例

(1)使用 Spring 的事件驱动模型的一般步骤如下:

  • 定义事件:继承抽象类 ApplicationEvent,并且写相应的构造函数;
  • 定义事件监听者:实现 ApplicationListener 接口,重写 onApplicationEvent() 方法;
  • 定义事件发送者:发送者调用 ApplicationContext 中的 publishEvent 方法来发送事件消息;

(2)示例代码如下所示:

  • 首先,定义一个继承自 ApplicationEvent 的事件类 CustomEvent
import org.springframework.context.ApplicationEvent;public class CustomEvent extends ApplicationEvent {private String message;public CustomEvent(Object source, String message) {super(source);this.message = message;}public String getMessage() {return message;}
}
  • 接下来,创建一个实现了 ApplicationListener 的事件监听器 CustomEventListener
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;@Component
public class CustomEventListener implements ApplicationListener<CustomEvent> {@Overridepublic void onApplicationEvent(CustomEvent customEvent) {String message = customEvent.getMessage();System.out.println("接收到的信息为: " + message);}
}
  • 然后,创建一个事件发布者 EventPublisher
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;@Component
public class CustomPublisher {@Autowiredprivate ApplicationContext applicationContext;public void publish(CustomEvent customEvent) {this.applicationContext.publishEvent(customEvent);}
}
  • 当调用 CustomPublisherpublish() 方法时,比如 customPublisher.publish(“Hello, World!”) ,控制台就会打印出:
接收到的信息为: Hello, World!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/27381.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优化CSS重置过程:探索CSS层叠技术的应用与优势

目录 下面是正文~~ CSS重置方法 方法的结合 合并方法的问题 通用移除样式 顺序很重要 CSS 优先级 我们的CSS特异性冲突 CSS Layers 来拯救 Sass 预处理器支持 浏览器支持 总结 这篇文章介绍了一种名为CSS层叠的技术&#xff0c;用于优化CSS重置过程。它解释了CSS重…

re学习(18)[ACTF新生赛2020]rome1(Z3库+window远程调试)

参考视频: Jamiexu793的个人空间-Jamiexu793个人主页-哔哩哔哩视频 代码分析&#xff1a; 其主要内容在两个while循环中&#xff08;从定义中可知flag位16个字符&#xff09;。 看第二个循环&#xff0c;可知是比较result和经过第一个循环得到的v1比较&#xff08;就是flag…

免费使用Elasticsearch官网15天

注册登录 点击创建索引时候会给你展示一个密钥。这个密钥就是你的用户密码 如下图 你的服务地址大致样式如下 https://huihai.es.us-central1.gcp.cloud.es.io 这里需要你输入用户密码,上面图4&#xff08;图中&#xff09;&#xff0c;下载时候的用户密码 登录完成 这样就能…

使用docker的常见bug

BUG1&#xff1a;磁盘被占满导致docker无法使用 docker ps 【查看docker能否正常使用】 正常的话会打印下图信息: 不正常的话打印如下图信息&#xff1a; journalctl -u docker 【查看docker无法正常使用的原因】&#xff0c;本次测试中遇到下图bug&#xff0c;意思是/var/l…

Flutter 跳转应用市场评分——超简洁实现

最近在做flutter跳转去应用市场评分的功能&#xff0c;虽然是一个很小的功能&#xff0c;但是要做的既简单又高效&#xff0c;同时又能把细节考虑到&#xff0c;还是有坑要走的&#xff0c;这边记录一下。 背景 做应用市场相关的运营&#xff0c;在app内增加评分引导&#xf…

前端学习——JS进阶 (Day3)

编程思想 面向过程编程 面向对象编程 (oop) 构造函数 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport…

python+allure+jenkins

目录 前言 在 python 中使用 allure 1. 安装 pytest 2. 安装 pytest-allure-adaptor 3. 使用 pytest 执行测试用例并生成 allure 中间报告&#xff08;此步骤可以省略&#xff0c;因为在 jenkins job 中会配置执行类似的命令&#xff09; 4. Jenkins 中安装Allure Jenkin…

行业追踪,2023-07-17,静待减速器macd反转

自动复盘 2023-07-17 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

Spring源码学习-核心注解,架构以及整体流程

目录 核心注解核心组件接口分析基础接口ResourceResourceLoaderResourceResourceLoader BeanFactory结构解析图示核心的子接口 BeanDefinition加载注册流程(xml形式的) BeanDefinitionReaderBeanDefinitionRegistryApplicationContext类结构图示结构解析 Aware接口类图xxAware是…

什么是计算机蠕虫?

计算机蠕虫诞生的背景 计算机蠕虫的诞生与计算机网络的发展密切相关。20世纪60年代末和70年代初&#xff0c;互联网还处于早期阶段&#xff0c;存在着相对较少的计算机和网络连接。然而&#xff0c;随着计算机技术的进步和互联网的普及&#xff0c;计算机网络得以迅速扩张&…

Windows系统如何查看物理cpu核数?

Step1&#xff1a;WinR 打开cmd; Step2&#xff1a;输入dxdiag后&#xff0c;回车&#xff1b; Step3&#xff1a;即可查看&#xff1a;

M1 Mac如何安装CentOS7虚拟机(图文详细解说)

1、下载相应的文件 2、打开VMware Fusion pro进行安装 3、 输入许可证密钥 4、 将CentOS-7拖入“从光盘或映像中安装”中 5、点击继续 6、选择其他-->其他64位ARM-->继续 7、进行自定设置 8、这里更改名为“Centos7”&#xff08;不要加空格&#xff09;&#xff0c;存…