Spring 事件相关知识ApplicationEvent

Spring 事件相关知识ApplicationEvent

  • 事件工作流程
  • 相关类
    • ApplicationListener
    • ApplicationEvent 我们可以发布自己的事件
    • ApplicationEventPublisher
  • Spring框架中提供了多种事件类型,常用的几个事件类型如下:

Spring 事件驱动模型是 Spring 框架中的一个组成部分,它提供了一种基于事件的方法来驱动应用程序的演化。Spring 事件驱动模型基于观察者模式 (Observer Pattern) 和发布 - 订阅模式 (Publish-Subscribe Pattern),它允许应用程序中的组件之间相互通信,并且可以在需要的时候自动触发事件以通知其他组件。

Spring Framework中的事件驱动模型包括以下几个关键元素:

事件:一个Java类,它封装了与应用程序中某个状态相关的信息,例如用户注册、订单创建等。事件类必须继承自ApplicationEvent抽象类。可以定义自己的事件类型,并根据需要添加自定义属性。

事件发布器(Event Publisher):负责发送事件。在Spring中,事件发布器是一个接口ApplicationEventPublisher,它定义了一个方法publishEvent(),可以将事件发布到所有已注册的监听器。

事件监听器(Event Listener):用于监听事件的对象,负责处理事件。在Spring中,事件监听器是一个接口ApplicationListener,它定义了一个方法onApplicationEvent()。只要事件被发布,所有已注册的监听器都会收到该事件并执行相应的操作。

事件源:事件发生的地方。在Spring中,事件源通常是一个Bean。当该Bean的状态发生变化时,它会创建一个相应的事件并将其传递给事件发布器。

使用Spring的事件驱动模型,开发人员可以轻松实现松散耦合的架构,同时也更容易进行单元测试。此外,事件驱动模型还可以提高代码的可读性和可维护性。

事件工作流程

Spring 事件驱动模型的工作流程如下:

当目标组件发生事件时,事件发布者会发布该事件。

事件监听器会检测到该事件,并触发相应的方法。

事件订阅者会检测到该事件,并触发相应的方法。

如果事件发布者和事件订阅者之间存在关联,那么事件发布者会将事件传递给事件订阅者。

如果事件订阅者没有关联,那么事件发布者会将事件广播给所有注册的事件订阅者。

通过使用 Spring 事件驱动模型,应用程序中的组件可以相互通信,并且在需要的时候自动触发事件以通知其他组件。这种模型可以用于实现许多不同的应用程序功能,例如用户界面组件之间的通信、数据库事件驱动等。

相关类

ApplicationListener

编写一个监听器(ApplicationListener的实现类)来监听某个事件(ApplicationEvent及其子类)

public class ApplicationEventDemoListenter implements ApplicationListener<ApplicationEvent> {
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        System.out.println("++++++++++"+event);
    }
}

这样我们就可以获取到 ApplicationEvent及其子类所有的事件
ApplicationEventDemoListenter 交由spring管理,xml或者注解的方式都可以
也可以用下面的注解方式

@EventListener(classes = {ApplicationEvent.class})
public void listen(ApplicationEvent event){
    System.out.println("UserService ...监听到的事件:"+event);
}

ApplicationEvent 我们可以发布自己的事件

ApplicationEvent 事件基类, EventObject是java提供的一个类

我们自定义事件时一般继承该类:

public class SpringEventDemo extends ApplicationEvent {
    public SpringEventDemo(Object source) {
        super(source);
    }

    public SpringEventDemo(Object source, Clock clock) {
        super(source, clock);
    }
}

监听:

public class SpringEventDemoListener implements ApplicationListener<SpringEventDemo> {
    @Override
    public void onApplicationEvent(SpringEventDemo event) {
        System.out.println("=========================="+event);
    }
}

事件发布:
context.publishEvent(new SpringEventDemo(“我们自己定义的事件”));

public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-provider.xml");
        context.start();
        context.publishEvent(new SpringEventDemo("我们自己定义的事件"));
        System.in.read();
    }

在这里插入图片描述

ApplicationEventPublisher

public interface ApplicationEventPublisher {

    /**
     * 发布事件
     * @param event 事件
     */
    void publishEvent(ApplicationEvent event);

}

ApplicationEventMulticaster事件管理、分发器。
ApplicationEventMulticaster统一定义公共行为,
AbstractApplicationEventMulticaster抽象类处理公共逻辑。SimpleApplicationEventMulticaster默认分发器,只需要执行具体的分发逻辑。
supportEvent方法检查事件是否需要被处理。

ApplicationContext 继承了 ApplicationEventPublisher 因此可以发布事件

Spring框架中提供了多种事件类型,常用的几个事件类型如下:

ContextRefreshedEvent:当ApplicationContext被初始化或刷新时发布。例如,当应用程序启动时或热部署时。

ContextStartedEvent:当ApplicationContext启动时发布,即调用其start()方法。

ContextStoppedEvent:当ApplicationContext停止时发布,即调用其stop()方法。

ContextClosedEvent:当ApplicationContext关闭时发布,即调用其close()方法。

RequestHandledEvent:在Web应用程序中,当Http请求已经被处理并且响应已经生成时发布。

除了上述常用的事件类型,Spring还提供了其他一些事件类型,例如ServletRequestHandledEvent、SessionCreatedEvent、SessionDestroyedEvent等。开发人员可以根据自己的需求,定义自己的事件类型,并添加自定义属性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

oracle安装

服务端安装&#xff08;公司中不需要&#xff0c;只安装客户端就行&#xff09; 1、挂载一个Windows系统 双击vmx文件 启动 2、网络配置 添加一个网络 自己电脑看控制面板是否添加虚拟网卡 查看连接的网络&#xff0c;ip地址不能为1&#xff0c;为1就自己修改&#xff0c;…

【剑指offer】数据结构——数

目录 数据结构——数直接解【剑指offer】43. 1&#xff5e;n 整数中 1 出现的次数【剑指offer】44. 数字序列中某一位的数字【剑指offer】49. 丑数【剑指offer】60. n个骰子的点数【剑指offer】62. 圆圈中最后剩下的数字【剑指offer】64. 求12…n 特殊解——分治法 &#xff1a…

用反射设计通用的实例化对象方案

需求 对象的相关信息存储在javabean.properties文件中&#xff0c;通过读取properties文件中的信息&#xff0c;实例化对象&#xff0c;要求程序不能硬编码&#xff0c;即程序可以通用&#xff0c;针对不同的对象&#xff0c;都可以实例化。仅需修改配置文件&#xff0c;不需要…

【课代表笔记】直播回顾:Top药企的数字化实践集锦

【K讲了】系列直播之医药行业第一期&#xff1a;Top药企的数字化实践集锦前不久已在视频号和大家如期见面&#xff0c;以下是课代表为大家抄好的笔记~~ 斯歌K2的医药行业经验 K2在医药领域拥有丰富的客户积累及实施经验&#xff0c;全球TOP 10药企中有7家选择K2。斯歌K2已在医药…

数据链路层:封装成帧

1.数据链路层&#xff1a;封装成帧 笔记来源&#xff1a; 湖科大教书匠&#xff1a;封装成帧 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 封装成帧是指数据链路层给上层交付的协议数据单元添加帧头和帧尾使之成为帧 帧头和帧尾中包含重要的控制…

java的UDP(一)

文章目录 1. 简介2. UDP客户端3. UDP服务器4. DatagramPacket类 1. 简介 Java中的UDP实现分为两个类&#xff1a;DatagramPacket和DatagramSocket。DatagramPacket类将数据字节填充到UDP包汇总&#xff0c;这称为数据报&#xff0c;由你来解包接收的数据报。DatagramSocket可以…

Day57【动态规划】647.回文子串、516.最长回文子序列

647.回文子串 力扣题目链接/文章讲解 视频讲解 1、确定 dp 数组下标及值含义 dp[i][j]&#xff1a;表示区间范围为 [i, j] 的子串是否为回文串&#xff08;j > i&#xff09; 这样定义才方便我们的递推&#xff01;怎么想到的&#xff1f;回文串需要对比串的两端&#…

用可编程逻辑器件FPGA LCMXO2-4000HC-6MG132I 实现智能汽车解决方案设计

LCMXO2-4000HC-6MG132I lattice莱迪斯深力科 MachXO2 可编程逻辑器件 (PLD) 由六个超低功耗、即时启动、非易失性 PLD 组成&#xff0c;可提供 256 至 6864 个查找表 (LUT) 的密度。 MachXO2 系列 PLD 提供多种特性&#xff0c;例如嵌入式块 RAM (EBR)、分布式 RAM 和用户闪存 …

基于html+css的图片展示93

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Spring Boot注解@Async与线程池的配置

目录 使用异步注解创建异步任务 Async注解 使用Demo 线程池配置 Spring Boot默认用于异步任务线程池配置 线程池配置 线程池隔离 为什么需要线程池隔离&#xff1f; 线程池隔离实现Demo 线程池配置&#xff1a; 异步任务&#xff1a; 测试demo 参考内容&#xff1a; 使…

Modern CSV:大型 CSV 文件编辑器/查看器 Crack

Modern CSV用于快速查看大型 CSV 文件 适用于 Windows、Mac 和 Linux 的复杂 CSV 编辑器/查看器 被使用 电子商务运营商。数据科学家。会计师。 IT 专业人员。学生。医学研究人员。数字营销人员。生物学家。工程师。 现代 CSV 是适用于 Windows、Mac 和 Linux 的功能强大的表格…

面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

源自网络收集&#xff0c;仅供参考 实验三收集到两份完整报告&#xff0c;这是其一&#xff0c;另一份见本专栏下一篇文章。 实验题目 《面向对象程序设计》 实验三 实验题目&#xff1a;子窗口与控件的基本用法、资源的使用 整体目的&#xff1a;理解、窗口之间的消息传送…

【Netty】Netty中的超时处理与心跳机制(十九)

文章目录 前言一、超时监测二、IdleStateHandler类三、ReadTimeoutHandler类四、WriteTimeoutHandler类五、实现心跳机制5.1. 定义心跳处理器5.2. 定义 ChannelInitializer5.3. 编写服务器5.4. 测试 结语 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&#…

内存栈与CPU栈机制

1. 内存栈: 先入后出,LIFO(LAST IN FIRST OUT) 入栈:将一个新的元素放到栈顶 出栈:从栈顶取出一个元素 栈顶元素总是最后一个入栈,需要时出栈. 2.CPU栈机制 8086CPU提供相关指令以栈方式来访问内存空间.相当于将一段内存当做栈来使用 8086CPU提供的入栈指令为:PUSH ,出栈指令为…

JointJS+ v3.7 Crack

JointJS v3.7 改进了对 SVG 上下文中的外部对象的支持。 2023 年 5 月 30 日 - 16:00 新版本 特征 改进了对外部对象 (HTML) 的支持- 外部对象已成为 Web 开发的标准&#xff0c;JointJS 现在已经在 SVG 上下文中引入了对外部对象的全面且功能齐全的支持。这意味着您现在可以在…

Elasticsearch 8.8.0 发布

Elasticsearch 是一个基于 Lucene 库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎&#xff0c;具有 HTTP Web 接口和无模式 JSON 文档。Elasticsearch 基于 Java 开发&#xff0c;并在 SSPL Elastic License 双重授权许可下作为开源软件发布。 Elasticsearch 8…

win10系统如何设置虚拟回环

在日常生活中&#xff0c;人们(特别是IT行业者)通常需要在一台机上进行软件测试&#xff0c;而同一台计算上通常只能使用一个地址&#xff0c;而在需要同时使用两个地址进行测试的时候就显得捉襟见肘。此方法通过配置window10自带的环回适配器&#xff0c;达到上述目的。 win1…

如何使用Kali进行信息收集?

渗透测试即模拟黑客入侵的手段对目标网络进修安全测试&#xff0c;从而发现目标网络的漏洞&#xff0c;对目标网络进行安全加固与漏洞修复。 Kali 是一个基于 debian 的渗透测试平台&#xff0c;其中集成了很多常见的和不常见的渗透测试工具&#xff0c;如下图&#xff1a; 工…

基于SSM的服装设计供需系统设计与实现

摘 要&#xff1a;作为服装设计的重要形式之一&#xff0c;服装具有显著的审美性&#xff0c;是人类情感表达不可忽视的代表形态。但在新时期背景下&#xff0c;随着服装设计的进一步优化&#xff0c;服装设计创新融合强度也随之增强。本文就服装设计供需系统进行深入探究。 服…

Linux之命令搜索

目录 Linux之命令搜索 Whereis命令 定义 基本信息 举例 which命令 定义 与whereis命令的区别 基本信息 举例 locate 命令 定义 优点 缺点 基本信息 案例 Linux之命令搜索 Whereis命令 定义 whereis --- 搜索系统命令的命令&#xff08;像绕口令一样&#xff09…