码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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. 事件源:在发布事件前传入的参数

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

     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 {
        @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主动下线操作。

  • 相关阅读:
    微调语言大模型选LoRA还是全参数?基于LLaMA 2深度分析
    神经系统图 基本结构图,大脑神经网络结构图片
    基于SpringBoot+MySQL的科研学术论文资讯推送系统
    【Unity ShaderGraph】| 给模型添加一个 边缘光效果 实战
    学会@ConfigurationProperties月薪过三千
    Mybatis源码编译
    nodejs采集淘宝、天猫网商品详情数据以及解决_m_h5_tk令牌及sign签名验证(2023-09-09)
    微信小程序设计之主体文件app-json-window
    达梦数据库(十) -------- mybatis-plus 整合达梦时,自动生成的 sql 语句报错
    3212力扣:统计X和Y频数相等的子矩阵数量
  • 原文地址:https://blog.csdn.net/m0_57640408/article/details/126214753
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号