当前位置: 首页 > article >正文

【Spring】聊聊@EventListener注解原理

1.一个Demo出发

在平时的开发中,其实编写同步线程代码是比较容易的,但是如何将一些操作和另外一些操作进行解除耦合,而事件方式 是一种很好的解耦合方式,比如当一个用户注销一个APP之后,需要发送一些短信 让他引流回来。

核心流程 其实就是 1.定义一个事件 2.事件发布器 3.事件监听器

1.1 定义一个事件

public class UserCloseEvent extends ApplicationEvent {

    private static final long serialVersionUID = 1L;

    private String msg ;

    public UserCloseEvent(Object source, String msg) {
        super(source);
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

1.2 发布事件

@Component
public class MyTestEventPubLisher {

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public void pushUserCloseListener(String msg) {
        applicationEventPublisher.publishEvent(new UserCloseEvent(this, msg));
    }
}

1.3 监听器

    @EventListener
    public void listening3 (UserCloseEvent event) {
        System.out.println("注解监听器===>UserCloseEvent->发送了一个注销用户的召回申请WA"+event.getClass().getName());
    }

我们来分析一下 整体的原理,首先定义一个事件,这就是一个普通的对象,第二个就是发布事件,以及事件监听器是怎么感知到 要执行动作。 了解了这个流程之后,就可以很清楚的明白整体的原理。

2. Spring原理流程解析

熟悉Spring源码 bean生命周期的,应该都知道 preInstantiateSingletons 方法,一共是两个对bean的操作,第一部分其实就是实例化、初始化 bean的过程,第二部分,针对的是实现了 实现了 SmartInitializingSingleton 的子类的初始化方法。

2.1 @EventListener 注册为bean的过程

在这里插入图片描述
和事件相关的实现类就是图中的 EventListenerMethodProcessor
在这里插入图片描述
可以看到实现了该接口

public class EventListenerMethodProcessor implements SmartInitializingSingleton, xxx {

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
好了,梳理下具体的过程 其实就是在所有bean进行初始化完成之后,然后在针对注解做解析工作,封装成Listener。

2.2 事件触发的流程

在这里插入图片描述
在这里插入图片描述
这里其实就是根据执行的类型和listener进行匹配,如果是就开始顺序执行,当然也可以使用线程池异步执行。因为前面已经封装了带有注解的方法的信息,所以最终会通过反射的方式执行方法。

在这里插入图片描述

3 造轮子的EventBus

其实针对Guava的EventBus 核心流程
1.定义注解类 @ Subscribe
2.针对提供一个事件控制类EventBus 内部持有 ObserverRegistry 提供一个根据注册和执行事件的方法。主要存储一个map,key是事件类型,value是一个COW set,对应的就是封装的ObserverAction(Class,method) 主要用于后续的反射执行方法。

在这里插入图片描述

总结

其实对于一个框架来说,提供的功能是否易用,非常重要,并且不能和业务代码进行强耦合。所以虽然我们平时的工作是针对CRUD,但是总有一些非业务功能开发,比如一些基础架构的工作,监控、耗时、日志等一些通用功能,一定要使用非侵入业务的方式,AOP就是一种方式,当然各个框架也一般提供一定的预留拓展点,来实现不同的功能。


http://www.kler.cn/a/420248.html

相关文章:

  • rpm包转deb包或deb包转rpm包
  • VScode离线下载扩展安装
  • 下载 M3U8 格式的视频
  • Python 三目运算实战详解
  • Qt的定时器应用案例 || Qt的图片添加显示
  • 前端 如何用 div 标签实现 步骤审批
  • Linx下自动化之路:PostgreSQL 安装包精准自动化部署至指定路径并注册成服务全解析
  • 【计算机网络】实验2:总线型以太网的特性
  • 中断,定时器相关内容
  • Selenium 基于浏览器自动化模块
  • react 组件双向绑定
  • 教务(选课)管理系统
  • SpringBoot -拦截器Interceptor、过滤器 Filter 及设置
  • c语言——数组名该如何理解呢?
  • VSCode中“Run Code”运行程序时,终端出现中文乱码解决方法
  • Burp Suite 全面解析:开启你的 Web 安全测试之旅
  • DNS查询工具
  • MyBatis框架 与 传统JDBC连接数据库的对比
  • selenium动态判断滚轮方向样例
  • 【深度学习|特征增强模块】AttentionEnhancementModule模块和普通 QKV Attention模块的在深度学习网络中的作用-2
  • 自动化是语法,智能化是语义与语用
  • 使用Python和OpenAI Whisper为视频生成字幕
  • Vue文字转语音实现
  • 二阶信息在机器学习中的优化;GPTQ算法利用近似二阶信息;为什么要求近似二阶(运算量大,ReLu0点不可微)
  • 【智商检测——DP】
  • 一些基于宏基因组的巨型病毒研究