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

SpringMVC:拦截Mybatis的mapper

我们在使用mybatis的时候会碰到一些公共添加时间,操作人员,更新时间、或者一些分页这个使我们如果要去添加每个对应的- service - dao - mapper - xml 这样就造成很多冗余代码,那这个时候我们就需要使用一些通用方法,统一就行修改和赋值。

我们就需要使用到拦截,那我们如何拦截 Mybatis的mapper呢?

我们拦截mapper有两种方法:

1、使用@Aspect注解

要去使用jdk的代理,否则代理不了mapper(即mybatis代理的mapper没有默认的构造器,cglib无法再给这个代理构造代理,会报如下错误

org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.sun.proxy.$Proxy13]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy13)

那我们需要将对@Aspect支持修改为jdk代理

<!-- 启动对@Aspectj的支持 true为cglib,false为jdk代理,为true的话,会导致拦截不了mybatis的mapper-->
<aop:aspectj-autoproxy proxy-target-class="false" />

之后就是使用注解去配置拦截,进行修改记录的操作

@Aspect
@Component
public class DataLogAspect {private static final Logger logger = LoggerFactory.getLogger(DataLogAspect.class);@Resourceprivate ActionMapper actionMapper;@Pointcut("execution(public * com.kingbal.infrastructure.repository.mapper.*.insert*(..)) " +"&& !execution(public * com.kingbal.infrastructure.repository.mapper.ActionMapper.insert*(..))")public void insert(){}@Pointcut("execution(public * com.kingbal.infrastructure.repository.mapper.*.update*(..))")public void update(){}@Pointcut("execution(public * com.kingbal.infrastructure.repository.mapper.*.delete*(..))")public void delete(){}@Around("insert() || update() || delete()")public Object addOperateLog(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {...}
}
2、使用MethodInterceptor

 使用aopalliance的MethodInterceptor

(1)配置文件

        去掉对@Aspect注解的支持(也可以不去掉,只要不是proxy-target-class = true就可以)。然后配置aop

<bean id="dataLogInterceptor" class="com.kingbal.infrastructure.dataLog.dataLogInterceptor" />
<aop:config><aop:pointcut id="dataLogInsertPointCut" expression="execution(* com.kingbal.infrastructure.repository.mapper..insert*(..))&amp;&amp; !execution(* com.kingbal.infrastructure.repository.mapper.ActionMapper.*(..))" /><aop:pointcut id="dataLogUpdatePointCut" expression="execution(* com.kingbal.infrastructure.repository.mapper..update*(..)) &amp;&amp; !execution(* com.kingbal.infrastructure.repository.mapper.ActionMapper.*(..))" /><aop:pointcut id="dataLogDeletePointCut" expression="execution(* com.kingbal.infrastructure.repository.mapper..delete*(..)) &amp;&amp; !execution(* com.kingbal.infrastructure.repository.mapper.ActionMapper.*(..))" /><aop:advisor advice-ref="dataLogInterceptor" pointcut-ref="dataLogInsertPointCut" /><aop:advisor advice-ref="dataLogInterceptor" pointcut-ref="dataLogUpdatePointCut" /><aop:advisor advice-ref="dataLogInterceptor" pointcut-ref="dataLogDeletePointCut" />
</aop:config>

(2)实现MethodInterceptor

public class DataLogInterceptor implements MethodInterceptor{private static final Logger logger = LoggerFactory.getLogger(DataLogInterceptor.class);public DataLogInterceptor() {}@Resourceprivate ActionMapper actionMapper;@Overridepublic Object invoke(MethodInvocation methodInvocation) throws Throwable {Method method = methodInvocation.getMethod();String methodName = method.getName();Class<?> cls = method.getDeclaringClass();Object service = methodInvocation.getThis();Object[] args = methodInvocation.getArguments();Integer actionType = -1; ...}
}

推荐使用 @Aspect

注意事项

1、如果service层有实现接口,则在其他地方注入的时候必须使用接口声明,否则会报错

2、拦截mapper,如果使用注解@Aspect ,必须强制使用JDK代理。

相关文章:

  • 如何设计高可用的淘客返利系统
  • Synchronized、volatile与ReentrantLock:比较这些同步机制在Java并发编程中的应用和区别
  • Spring响应式编程之Reactor操作符
  • Kubernetes 托管与非托管有哪些区别?应该怎么选型?
  • LeetCode:503. 下一个更大元素 II(Java 单调栈)
  • 如何在Web开发中创建、删除和修改按钮:实用指南
  • 华为仓颉语言:编程语言的新篇章
  • 说说MQ在你项目中的应用(一)
  • IOS开发学习日记(十六)
  • TXL编程语言环境安装
  • Redis 高可用 sentinel
  • 使用 JavaScript 获取电池状态
  • JavaWeb系列十六: jQuery初步入门
  • OpenAI Sora:我们来自混乱,我们也将回归混乱
  • C++抽象类
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Git的一些常用操作
  • Go 语言编译器的 //go: 详解
  • Laravel Mix运行时关于es2015报错解决方案
  • Linux中的硬链接与软链接
  • Netty 4.1 源代码学习:线程模型
  • Python_网络编程
  • 关于Flux,Vuex,Redux的思考
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 微信支付JSAPI,实测!终极方案
  • 项目管理碎碎念系列之一:干系人管理
  • 阿里云服务器购买完整流程
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (¥1011)-(一千零一拾一元整)输出
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (3)(3.5) 遥测无线电区域条例
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • [\u4e00-\u9fa5] //匹配中文字符
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [C#]DataTable常用操作总结【转】
  • [C#]winform使用onnxruntime部署LYT-Net轻量级低光图像增强算法
  • [C++]四种方式求解最大子序列求和问题