java 实现事件监听EventListener的方式详解及分析

这篇具有很好参考价值的文章主要介绍了java 实现事件监听EventListener的方式详解及分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们开发中经常遇到监听事件,首先我们先来了解下事件相关知识:

使用场景(场景一):银行操作转账成功后需要给客户发送短信和邮件,使用事件就可以实现解耦并异步。

我们监听事件之前要有事件源source,创建事件源(Event),发布事件(publishEvent),然后才能到监听事件。

事件驱动机制是观察者模式(称发布订阅)具体实现,事件对象(Event)相当于被观察对象(Subject), 事件监听(EventListener) 相当于观察者(Observer)

目录

1. 事件源:在发布事件前传入的参数

 2. 创建事件源(Event)

3. 发布事件(publishEvent)

4. 监听事件,两种方式:

4.1 注解@EventListener方式监听事件:

4.2 实现ApplicationListener接口监听事件

5. 事件驱动机制和MQ驱动机制对比

6. 发布、监听事件添加@Async异步

7. Spring容器自带发布机制


1. 事件源:在发布事件前传入的参数

可以是变量或者是自定义对象(类似于有参数)。

java 实现事件监听EventListener的方式详解及分析

 2. 创建事件源(Event)

创建事件源需要继承ApplicationEvent

public class MyEvent extends ApplicationEvent {

    /**
     * Create a new ApplicationEvent.
     *
     * @param source the object on which the event initially occurred (never {@code null})
     */
    public MyEvent(Object source) {
        super(source);
    }
}

3. 发布事件(publishEvent)

注入ApplicationEventPublisher类可以直接调用publishEvent方法进行发布事件。

@Service
public class TestPublishEventServiceImpl {

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    @Async   // 异步注解
    public void testPublishEvent() {
        System.out.println("业务代码已完成,下面开始发送短信及邮件");
        // 发送一个事件可以让发送短信和邮件都接收同一个事件(如果需要传不同的参数,就需要发布两个不同的事件)
        applicationEventPublisher.publishEvent(new MyEvent("事件源--自定义的事件触发了。。。"));
    }

4. 监听事件,两种方式:

4.1 注解@EventListener方式监听事件:

在方法上添加@EventListener注解,即可监听

@Component
public class MyListenerEvent {
    @Async   // 异步方式
    @EventListener   // 监听器注解
    public void myListenerEvent(MyEvent event) {
        System.out.println("获取到的事件源 = " + event.getSource());
        System.out.println("注解方式--接收到MyEvent事件,发送短信/发送邮件");
    }
}

4.2 实现ApplicationListener接口监听事件

实现ApplicationListener接口,泛型既是需要添加的事件对象

@Component
public class MyListener implements ApplicationListener<MyEvent> {
    @Async // 异步方式
    @Override
    public void onApplicationEvent(MyEvent event) {
        System.out.println("获取到的事件源 = " + event.getSource());
        System.out.println("添加接收到MyEvent事件,发送短信/发送邮件");
    }
}

5. 事件驱动机制和MQ驱动机制对比

MQ驱动的作用:解耦、异步、削峰,就不过多解释了。

        优点:MQ可供并发量大、微服务使用

        缺点:使用MQ会提升架构的复杂度,维护性降低。

事件驱动机制:解耦、异步,做不到削峰。

        优点:spring框架自带易维护,集成简单

        缺点:无法支撑大并发,只能单机通知,无法排队,无法削峰。

总结:消息量不大时就可以使用事件驱动机制

6. 发布、监听事件添加@Async异步

启动类必须要添加@EnableAsync才能生效

发布事件或监听事件任意一个加上异步@Async即可,推荐发布事件(publishEvent)加异步。
如果publishEven和EventListener过程中都有大量处理数据库或其他耗时的业务,也可以两者同时加上@Async。

7. Spring容器自带发布机制

spring容器(ApplicationContextEvent)在,创建,刷新,停止,关闭都有相应的操作,我们可以利用这个做一系列容器相关的操作。比如我们可以在容器关闭的时候关闭nacos主动下线操作。文章来源地址https://www.toymoban.com/news/detail-465067.html

到了这里,关于java 实现事件监听EventListener的方式详解及分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从注解@EventListener和@TransactionalEventListener掌握Spring的事件机制原理

    Spring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式;为的就是业务系统逻辑的解耦,提高可扩展性以及可维护性。事件发布者并不需要考虑谁去监听,监听具体的实现内容是什么,发布者的工作只是为了发布事件而已。 在Spring中我们可以通过实现

    2024年02月06日
    浏览(29)
  • 【Android学习笔记】事件监听机制详解

    两种事件处理机制 基于监听的事件处理 基于回调的事件处理 涉及到的三类对象 Event Source事件源,指各个组件。 Event 界面组件上发生的特定的事情,。 Event Listener监听事件源发生的事情。并对各种事情作出相应的响应。 Event Handler事件处理器,当事件监听器捕获事件后,由响

    2024年02月11日
    浏览(58)
  • 前端Vue select 下拉框详解以及监听事件

    目录 简介 使用详解 演示示例 :key=\\\"option.value\\\" :value=\\\"option.value\\\" 区别 监听事件         在 Vue 中,下拉框通常通过 select 元素与一系列的 option 元素来创建。Vue 的数据绑定和指令(如 v-model 和 v-for )可以使创建动态下拉框变得非常简单和灵活。下面详细介绍如何在 Vue 中使

    2024年02月20日
    浏览(49)
  • Java键盘事件处理及监听机制解析

    Java事件处理采用了委派事件模型。在这个模型中,当事件发生时,产生事件的对象将事件信息传递给事件的监听者进行处理。在Java中,事件源是产生事件的对象,比如窗口、按钮等;事件是承载事件源状态改变时的对象,比如键盘事件、鼠标事件、窗口事件等等。当事件发

    2024年02月13日
    浏览(38)
  • Gerrit 事件监听实现

    Centos 7.9 Gerrit 2.15 docker-compose.yml 启动docker 利用 gerrit stream-events 实现对Gerrit所有事件的监听 生成密钥 配置SSH 配置All-Projects的Stream Events 代码部分 在Gerrit操作patch,代码会打印相应的事件 以Gerrit 2.15为例 使用webhook插件实现Gerrit主动向自己的web服务发送请求 下载打包webhooks插件

    2024年02月08日
    浏览(39)
  • 微信小程序 自定义全局事件监听实现

    一般app页面都需要关联刷新,比如登录后刷新登录前页面,故此,需要一个全局事件监听类,怎么实现呢? 根目录创建文件夹utils,新建文件eventBus.js(致敬java平台的EventBus),码入以下代码: 主要就是newKey、on、off、post方法,分别是创建key、开始监听、结束监听、发出事件

    2024年02月11日
    浏览(47)
  • C 实现Window/DOS 键盘监听事件

    今天是重新复习C语言实现的第一天,今天想编写C 对Windwos/Dos 键盘事件的学习。但是我在安装Visual Studio 2022 没有安装MFC 框架,今天记录下VS++追加 MFC框架。 1、打开vs++,点击创建新项目,右侧滑动框拉到最底层,找到安装多个工具和功能,如下图所示:  2.点击蓝色的“安装

    2024年02月11日
    浏览(61)
  • python——实现鼠标与键盘监听与事件处理

    侦听按键 侦听鼠标 监听按键 需要注意的是必须使用cv加载图像,只有点击图像窗口才能侦听点击窗口时所使用的按键 ord和chr的用法我这里重复一下,可以实现对于acall码的解释,方便直接看到按键结果 ord()函数主要用来返回对应字符的ascii码, chr()主要用来表示ascii码对应的

    2024年02月06日
    浏览(41)
  • Qt实现全局鼠标事件监听器-Linux

    更多精彩内容 👉个人内容分类汇总 👈 👉Qt自定义模块、工具👈 Qt版本:V5.12.5 兼容系统: Windows:这里测试了Windows10,其它的版本没有测试; Linux:这里测试了ubuntu18.04、20.04,其它的没有测试; Mac:等啥时候我有了Mac电脑再说。 有时候我们想获取到【系统全局鼠标事件】

    2024年02月11日
    浏览(42)
  • Qt实现全局键盘事件监听器-Windows

    更多精彩内容 👉个人内容分类汇总 👈 👉Qt自定义模块、工具👈 Qt版本:V5.12.5 兼容系统: Windows:这里测试了Windows10,其它的版本没有测试; Linux:这里测试了ubuntu18.04、20.04,其它的没有测试; Mac:等啥时候我有了Mac电脑再说。 有时候我们想获取到全局键盘事件,使用

    2024年02月09日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包