【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析

文章目录

    • 前言
    • 参考目录
    • 测试方法
      • 配置说明
      • 测试方法
    • 功能调用流程分析
      • 事件监听器初始化
      • 事件发布流程

前言

因为之前比较忙所以匿了一段时间,顺便当了神雕大侠(“阳过”)。前段时间框架已经发布了新版本 V4.4.0,而在最新的 dev 分支中使用了事件监听器对代码进行解耦,所以这篇文章来简单分析一下它的源码。

参考目录

  • Spring 官方文档 - Standard and Custom Events
  • 狮子大佬的博客 - SpringBoot 事件机制使用方式与特性讲解
  • it_lihongmin - Spring源码-事件监听机制(@EventListener实现方式)

事件的使用其实非常简单,特别是使用 Spring 提供的注解 @EventListener,只需要传入指定的参数即可,下面将从初始化以及方法调用两个方面进行简单的分析。

为了简单起见,我使用的是自定义方法,并且是在4.X分支(主分支)下进行演示,dev分支已经使用事件重构了OSS加载配置以及日志记录配置等方法,有兴趣的话可以自行查看。

测试方法

配置说明

  • 框架版本:V4.4.0
  • Spring Boot 版本:V2.7.6
    【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第1张图片

测试方法

com.ruoyi.demo.controller.TestDemoController
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第2张图片

事件对象:
com.ruoyi.demo.domain.event.DemoEvent
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第3张图片

com.ruoyi.demo.domain.event.DemoEvent2
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第4张图片

功能调用流程分析

事件监听器初始化

由注解 @EventListener 标注的方法即为事件监听器。

org.springframework.context.event.EventListener
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第5张图片

可以看到红框中的注释,指出了主要的处理类是 EventListenerMethodProcessor

org.springframework.context.event.EventListenerMethodProcessor
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第6张图片

这实际上是一个后置处理器,有一个重要的方法:
EventListenerMethodProcessor#afterSingletonsInstantiated
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第7张图片

最主要的逻辑是处理bean的方法:
EventListenerMethodProcessor#processBean
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第8张图片

最开始需要做判断:

  1. nonAnnotatedClasses 是没有注解的类的集合,if内部的方法在每次处理 bean 时都会把新的放进去;
  2. isCandidateClass 判断是否是候选类;
  3. isSpringContainerClass 判断是否是 Spring 容器类。

判断通过进入方法体:
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第9张图片

当有符合的方法,则包装成 ApplicationListenerMethodAdapter
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第10张图片

ApplicationListenerMethodAdapter#ApplicationListenerMethodAdapter
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第11张图片

最终将监听器存入Spring context。
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第12张图片

事件发布流程

发布事件操作很简单,只需要调用 ApplicationContextpublishEvent 方法即可。

【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第13张图片

org.springframework.context.ApplicationEventPublisher
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第14张图片

AbstractApplicationContext#publishEvent
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第15张图片

同一个方法可以有多个监听器。

【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第16张图片

SimpleApplicationEventMulticaster#multicastEvent
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第17张图片

【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第18张图片

SimpleApplicationEventMulticaster#invokeListener
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第19张图片

SimpleApplicationEventMulticaster#doInvokeListener
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第20张图片

注意这里是调用 ApplicationListenerMethodAdapter 的方法:
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第21张图片

ApplicationListenerMethodAdapter#onApplicationEvent
在这里插入图片描述

ApplicationListenerMethodAdapter#processEvent
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第22张图片

ApplicationListenerMethodAdapter#doInvoke
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第23张图片

这里实际上就是调用具体事件监听器的方法:
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第24张图片

控制台的打印:
【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析_第25张图片

(完)

你可能感兴趣的:(框架学习,-,若依,/,RuoYi-Vue-Plus,spring,java,后端,RuoYi-Vue-Plus)