Spring 事件相关知识ApplicationEvent

news2024/11/27 22:40:26

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等。开发人员可以根据自己的需求,定义自己的事件类型,并添加自定义属性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uCOSii中的事件标志组

事件标志管理 (EVENT FLAGS MANAGEMENT) OSFlagAccept() 无等待查询”事件标志组的事件标志位”是否建立 OSFlagPend() 需要等待”事件标志组的事件标志位”建立 OSFlagCreate() 建立一个事件标志组 OSFlagDel() 删除一个事件标志组 OSFlagPost() 置位或清0事件标志组中的…

SpringBoot整合百度云人脸识别功能

SpringBoot整合百度云人脸识别功能 1.在百度官网创建应用 首先需要在百度智能云官网中创建应用&#xff0c;获取AppID&#xff0c;API Key&#xff0c;Secret Key 官网地址&#xff1a;https://console.bce.baidu.com/ 2.添加百度依赖 添加以下依赖即可。其中版本号可在mav…

【问卷分析】调节效应检验的操作①

文章目录 1.首先要明白自己的调节和自变量是什么类别的2.实操演练2.1 当调节变量是连续变量时2.1.1 将ml中心化2.1.2 使用分层回归探讨自变量和ml的交互对adh的影响2.1.3 结果解读 1.首先要明白自己的调节和自变量是什么类别的 2.实操演练 在本次演练中&#xff0c;我们以自变…

马斯克要用人工智能对抗人工智能

导读&#xff1a;马斯克对人工智能可能变得失控并“摧毁人类”的担忧促使他采取行动&#xff0c;发起了一个名为“TruthGPT”的项目。 本文字数&#xff1a;1400&#xff0c;阅读时长大约&#xff1a;9分钟 亿万富翁埃隆马斯克在谈到人工智能&#xff08;AI&#xff09;的危险时…

瑞合信LED字幕WiFi卡使用教程(8.0版)

请按照提示下载和安装软件&#xff0c;同时请允许所有权限&#xff0c;如下图&#xff1b; 也可以在各大主流应用商店&#xff08;华为、小米、OPPO、vivo、App Store等&#xff09;搜索“瑞合信”直接安装。 首次使用APP时会提示注册登录软件&#xff0c;你可以选择“使用微信…

深度学习进阶篇-预训练模型[4]:RoBERTa、SpanBERT、KBERT、ALBERT、ELECTRA算法原理模型结构应用场景区别等详解

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

Full-Scanner是一个多功能扫描工具,支持被动/主动信息收集,漏洞扫描工具联动,可导入POC和EXP

github项目地址&#xff1a;https://github.com/Zhao-sai-sai/Full-Scanner gitee项目地址&#xff1a;https://gitee.com/wZass/Full-Scanner 工具简介 做挖漏洞渗透测试有的时候要去用这个工具那个工具去找感觉麻烦我自己就写了一个简单的整合工具&#xff0c;有互联网大佬不…

Presto之BroadCast Join的实现

一. 前言 在Presto中&#xff0c;Join的类型主要分成Partitioned Join和Broadcast Join&#xff0c;在Presto 之Hash Join的Partition_王飞活的博客-CSDN博客 中已经介绍了Presto的Partitioned Join的实现过程&#xff0c;本文主要介绍Broadcast Join的实现。 二. Presto中Broa…

ChatGPT免费使用的方法有哪些?

目录 一、ChatGpt是什么&#xff1f; 二、ChatGPT国内免费使用的方法&#xff1a; 第一点&#xff1a;电脑端 第二点&#xff1a;手机端 三、结语&#xff1a; 一、ChatGpt是什么&#xff1f; ChatGPt是美国OpenAI [1] 研发的聊天机器人程序 。更是人工智能技术驱动的自然语…

1. 从JDK源码级别彻底刨析JVM类加载机制

JVM性能调优 1. 类加载的运行全过程1.1 加载1.2 验证1.3 准备1.4 解析 本文是按照自己的理解进行笔记总结&#xff0c;如有不正确的地方&#xff0c;还望大佬多多指点纠正&#xff0c;勿喷。 课程内容: 1、从java.exe开始讲透Java类加载运行全过程 2、从JDK源码级别剖析JVM核…

【地铁上的面试题】--基础部分--数据结构与算法--数组和链表

零、章节简介 《数据结构与算法》是《地铁上的面试题》专栏的第一章&#xff0c;重点介绍了技术面试中不可或缺的数据结构和算法知识。数据结构是组织和存储数据的方式&#xff0c;而算法是解决问题的步骤和规则。 这一章的内容涵盖了常见的数据结构和算法&#xff0c;包括数组…

DevOps工作级开发者认证——软件发展

. 本文先从软件产业的现状、发展趋势及挑战&#xff0c;说明敏捷和DevOps必将成为业界主流的研发模式。接着介绍和阐述了敏捷和DevOps的关系&#xff0c;相关理念、价值和主要工程方法。最后重点介绍了某著名公司端到端DevOps的实施框架及其主要内容。 本文的目的&#…

javascript基础八:JavaScript原型,原型链 ? 有什么特点?

一、原型 JavaScript 常被描述为一种基于原型的语言——每个对象拥有一个原型对象 当试图访问一个对象的属性时&#xff0c;它不仅仅在该对象上搜寻&#xff0c;还会搜寻该对象的原型&#xff0c;以及该对象的原型的原型&#xff0c;依次层层向上搜索&#xff0c;直到找到一个…

15_Linux工程目录与顶层Makefile

目录 Linux 工程目录分析 顶层Makefile详解 make xxx_defconfig过程 Makefile.build脚本分析 make过程 built-in.o文件编译生成过程 make zImage过程 Linux 工程目录分析 将正点原子提供的Linux源码进行解压,解压完成以后的目录如图所示: 图就是正点原子提供的未编译的…

【数据分类】GRNN数据分类 广义回归神经网络数据分类【Matlab代码#30】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 数据分类问题2. 广义回归神经网络&#xff08;GRNN&#xff09;3. 基于GRNN的数据分类步骤4. 部分代码展示5. 仿真结果展示6. 资源获取说明 【可更换其他算法&#xff0c;获取资源请见文章…

八大排序算法-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序、基数排序(下)

目录 前言冒泡排序&#xff08;Bubble Sort&#xff09;一、概念二、实现思路三、图示过程四、案例分析1、图示过程2、第一趟排序示例 五、代码1、代码示例2、代码解释3、运行结果 六、复杂度 快速排序&#xff08;QuickSort&#xff09;一、概念二、实现思路三、图示过程四、代…

【C++学习第十二讲】C++ 常量

文章目录 一、前言二、整数常量三、浮点常量四、布尔常量五、字符常量六、字符串常量七、定义常量7.1 #define 预处理器7.2 const 关键字 一、前言 常量是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。 常量可以是任何的基本数据类型&a…

202312读书笔记|《赶时间的人》——灰暗的从前会成为照亮未来的光,艰难的生活里,诗歌是那陡峭的另一面

202312读书笔记|《赶时间的人》——灰暗的从前会成为照亮未来的光&#xff0c;艰难的生活里&#xff0c;诗歌是那陡峭的另一面 《赶时间的人》 作者王计兵&#xff0c;一个外卖员的诗&#xff0c;饱含对生活的热情&#xff0c;向上的力量&#xff0c;仿若身在炼狱&#xff0c;心…

【014】C++数组之一维字符数组和二维字符数组

C数组之一维字符数组和二维字符数组 引言一、一维字符数组1.1、一维字符数组的初始化1.2、字符数组的遍历1.3、从键盘获取字符串1.4、使用示例 二、二维字符数组2.1、定义2.2、初始化2.3、访问 总结 引言 &#x1f4a1; 作者简介&#xff1a;专注于C/C高性能程序设计和开发&…

KVM虚拟化技术学习-基础入门

1.虚拟化技术概述 虚拟化[Virtualization]技术最早出现在 20 世纪 60 年代的 IBM ⼤型机系统&#xff0c;在70年代的 System 370 系列中逐渐流⾏起来&#xff0c;这些机器通过⼀种叫虚拟机监控器[Virtual Machine Monitor&#xff0c;VMM]的程序 在物理硬件之上⽣成许多可以运⾏…