前言

关于 AOP 的使用很常见,最开始接触若依框架的时候就已经写过一篇关于日志AOP 的文章,前段时间好像刚好有关于 @RepeatSubmit 的一些讨论,所以就决定写篇博客,内容虽然不算难,但是也是作为【RuoYi-Vue-Plus】框架学习的一部分。

参考目录

代码实现

1、Maven 引入

ruoyi-framework/pom.xml

<!-- SpringBoot 拦截器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2、AOP 注解: @EnableAspectJAutoProxy

com.ruoyi.framework.config.ApplicationConfig
在这里插入图片描述

3、自定义注解:@RepeatSubmit

com.ruoyi.common.annotation.RepeatSubmit
在这里插入图片描述

4、切面逻辑类:RepeatSubmitAspect

com.ruoyi.framework.aspectj.RepeatSubmitAspect
在这里插入图片描述

:关于 AOP 的底层逻辑,可以参考之前我写的另外一个学习笔记专栏 SpringBoot2 学习笔记 ,里面有更详细的说明,因此这里不再展开。
在这里插入图片描述

5、使用方式

使用方式很简单,也是在直接使用注解即可。也可以不设置参数,注解中都有设置默认值。
在这里插入图片描述

代码分析

#0、流程简图

在这里插入图片描述
简单画了一下流程简图,逻辑不算复杂,看一下 RepeatSubmitAspect 也是可以看懂的。主要有以下三个方法:

  • 请求之前执行的方法:doBefore
  • 处理完请求后执行的方法:doAfterReturning
  • 抛出异常处理的方法:doAfterThrowing

#1、doBefore

在这里插入图片描述
设置的注解参数:
在这里插入图片描述

步骤一:计算、判断时间间隔

如果设置了过期时间,则换算过期时间,且过期时间不能少于1秒,否则会抛出异常:
在这里插入图片描述

步骤二:组装缓存的 key 值

key 的组成部分是:指定key + url + MD5(消息头:请求参数)

对所有参数进行拼装,并且判断是否需要过滤:
在这里插入图片描述

最终拼装结果:
在这里插入图片描述
在这里插入图片描述

MD5 加密后进行拼装最终得到的 key 值:
在这里插入图片描述

步骤三:根据 key 判断缓存中是否有缓存对象

没有获取到对象说明是第一次访问,把当前 key-value 存入缓存中,并且把 key 值存入当前线程对象中,便于后面的方法进行获取。
在这里插入图片描述
查看 Redis 缓存中的结果:
在这里插入图片描述
有获取到对象说明时间间隔还未结束,根据定义的信息抛出重复提交的异常。
在这里插入图片描述

#2、doAfterReturning

在这里插入图片描述
这一个方法的逻辑也比较简单。
首先,先判断一下返回结果的类型,如果是 R 再进行转换。
接着,判断返回是否成功,如果成功就直接返回,如果是有业务流程上的错误则删除缓存和线程中的对象。

#3、doAfterThrowing

在这里插入图片描述
程序执行中捕获到抛出的异常,则直接删除缓存和线程中的对象。

Logo

快速构建 Web 应用程序

更多推荐