Spring 事件相关知识ApplicationEvent

news/2024/11/28 22:42:29/

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> {@Overridepublic 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> {@Overridepublic 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.ppmy.cn/news/96063.html

相关文章

SQL查询语言(3) 嵌套查询

如果不进行去重可能会出现一个情况 嵌套查询根据子查询的结果是否依赖于外层循环,分成相关子查询和不相关子查询 分类 IN 笔者总结&#xff1a;一般这种方法适用于查找有共性的元组&#xff0c;同一类事物比如查找和elsa选修相同科目的学生/选修相同科目的女同学。在后面我…

生成对抗性网络简介

生成对抗性网络简介 1. 原理1. GANs如何工作2. GAN架构3. 培训GAN4. 艺术家与评论家5. 评估指标6. GAN变体7. GAN应用8. 图像合成(Image synthesis)9. 图像到图像的转换(Image-to-image translation)10. 文本到图像(Text-to-Image)11. 超越图像12. 其他GAN应用参考这篇博…

计算机网络自顶向下方法笔记03

《计算机网络自顶向下方法》学习笔记03:网络层。 网络层提供了主机到主机的通信服务。网络中的每一台主机和路由器都有网络层部分。网络层能够被分解为两部分&#xff0c;数据平面和控制平面。 第四章 网络层&#xff1a;数据平面 1.概述 网络层的任务是取得源主机的报文段…

Shell脚本的基本运算符应用

记录&#xff1a;432 场景&#xff1a;Shell脚本的基本运算符应用。一般包括算术运算符、关系运算符、布尔运算符、逻辑运算符、字符串运算符、文件检测运算符。 版本&#xff1a;CentOS Linux release 7.9.2009。 1.算术运算符 1.1运算符 算术运算符。 &#xff1a;加法…

基于SSM的甜品店商城系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会经济的发展和…

计算机网络四 网络层

网络层的作用 网络层是计算机网络中的一个重要层次&#xff0c;它的主要作用是实现不同网络之间的通信和数据传输。网络层通过将数据分组并添加路由信息&#xff0c;使得数据可以在不同的网络之间传输。 网络层功能 异构网络互连 异构网络互连是指将不同类型的网络连接起来…

Python实现ACO蚁群优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

【2024最新】Spring面试题

✅✅作者主页:🔗请你喝杯Java的博客 🔥🔥精选专栏:🔗Java求职一条龙(持续更新中) 💞💞觉得文章还不错的话欢迎大家点赞👍➕收藏⭐️➕评论💬支持博主🤞 👉 👉你的一键三连是我更新的最大动力❤️❤️ 【2024最新】Spring面试题 一.Spring中@Resource…