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*(..))&& !execution(* com.kingbal.infrastructure.repository.mapper.ActionMapper.*(..))" /><aop:pointcut id="dataLogUpdatePointCut" expression="execution(* com.kingbal.infrastructure.repository.mapper..update*(..)) && !execution(* com.kingbal.infrastructure.repository.mapper.ActionMapper.*(..))" /><aop:pointcut id="dataLogDeletePointCut" expression="execution(* com.kingbal.infrastructure.repository.mapper..delete*(..)) && !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代理。
相关文章:
SpringMVC:拦截Mybatis的mapper
我们在使用mybatis的时候会碰到一些公共添加时间,操作人员,更新时间、或者一些分页这个使我们如果要去添加每个对应的- service - dao - mapper - xml 这样就造成很多冗余代码,那这个时候我们就需要使用一些通用方法,统一就行修改…...
MySQL查询性能优化解决方案
解决方案 主键与默认常用查询字段建立索引,普通字段类型选择 UNIQUE,索引方法 BTREE ;长文本使用 FULLTEXT,索引方法为无; 新建表时引擎默认设置为 MyISAM,不使用 InnoDB,因为 MyISAM 支持 MAT…...
系统安全(补充)
拒绝服务漏洞(拒绝服务漏洞将导致网络设备停止服务,危害网络服务可用性)旁路(旁路漏洞绕过网络设备的安全机制,使得安全措施没有效果)代码执行(该类漏洞使得攻击者可以控制网络设备,…...
腾讯云[HiFlow】| 自动化 -------HiFlow:还在复制粘贴?
文章目录 前言:一:HiFlow是什么二:功能介绍1.全连接2.自动化2.1定时处理特定任务2.2实时同步变更信息2.3及时获取通知提醒 3.零代码4.多场景5.可信赖 三:用户体验最后 前言: 随着网络时代的不断发展,自动化…...
音视频入门基础:H.264专题(3)——EBSP, RBSP和SODB
音视频入门基础:H.264专题系列文章: 音视频入门基础:H.264专题(1)——H.264官方文档下载 音视频入门基础:H.264专题(2)——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…...
误删群晖NAS数据有什么找回的方法?
1、使用群晖 NAS 自带的备份功能:如果您之前启用了群晖的备份计划,例如 Hyper Backup 或 Snapshot Replication,您可以从备份中恢复数据。 1.1、Hyper Backup 可以将数据备份到多种目的地,包括本地存储、外部硬盘、其他 NAS 设备等…...
【CRASH】freelist异常导致的异常地址访问
freelist异常导致的异常地址访问 问题现象初步分析继续深入新的发现沙盘推演寻找元凶分析代码后记 问题现象 项目一台设备几天内出现了两次crash,都是异常地址访问导致。 [66005.261660] BUG: unable to handle page fault for address: ffffff8881575110初步分析…...
【QT】C++ || 左值引用、右值引用、移动语义、完美转发
在C中,左右值引用是高级语言特性,用于更高效的内存和资源管理。了解左右值引用的概念对于编写高效的C代码非常重要。下面解释左右值引用的概念、用途和区别,并通过示例来说明它们的使用。 左值引用(Lvalue Reference)…...
【深度学习驱动流体力学】计算流体力学算例剖析与实现
目录 一.求解器分类汇总压缩性流动求解器(Compressible Flow Solvers):不可压缩流动求解器(Incompressible Flow Solvers):多相流动求解器(Multiphase Flow Solvers):热传递求解器(Heat Transfer Solvers):其他特殊求解器:其他常见求解器:求解器分类:二.求解器案…...
Midjourney角色一致性如何控制两个人物
实操演示 如何用Midjourney完成《甄嬛大战蝙蝠侠》 思路 先生成一个大致符合要求的图片,作为底图基于底图,用局部重绘功能,逐步修改细节 生成底图 我们想要甄嬛大战蝙蝠侠,先试一下直接让他生成 Zhen Huan vs. Batman, in t…...
Python基础-引用参数、斐波那契数列、无极分类
1.引用参数的问题 (1)列表(list) 引用参数,传地址的参数,即list1会因list2修改而改变。 list1 [1,2,3,4] list2 list1 print(list1) list2[2] 1 print(list2) print(list1)非引用参数,不传…...
【MySQL统计函数count详解】
MySQL统计函数count详解 1. count()概述2. count(1)和count(*)和count(列名)的区别3. count(*)的实现方式 1. count()概述 count() 是一个聚合函数,返回指定匹配条件的行数。开发中常用来统计表中数据,全部数据,不为null数据,或…...
大数据的发展,带动电子商务产业链,促进了社会的进步【电商数据采集API接口推动电商项目的源动力】
最近几年计算机技术在诸多领域得到了有效的应用,同时在多方面深刻影响着我国经济水平的发展。除此之外,人民群众的日常生活水平也受大数据技术的影响。 在这其中电子商务领域也在大数据技术的支持下,得到了明显的进步。虽然电子商务领域的发…...
Python类中变量定义详解
✨前言: Python中的类可以定义两种类型的变量:类变量和实例变量。 类变量(Class Variables): 类变量是在类级别上定义的变量,它们是对所有实例共享的。这意味着类变量只有一个副本,无论你创建了…...
c++ extern 关键字详解
extern关键字在C中用于声明变量或函数的外部链接。它通常用于以下几种场景: 声明全局变量:在一个文件中定义变量,在其他文件中使用extern声明该变量,以便在多个文件之间共享。C和C混合编程:在C代码中引用C语言编写的函…...
计算机网络:运输层 - TCP 流量控制 拥塞控制
计算机网络:运输层 - TCP 流量控制 & 拥塞控制 滑动窗口流量控制拥塞控制慢开始算法拥塞避免算法快重传算法快恢复算法 滑动窗口 如图所示: 在TCP首部中有一个窗口字段,该字段就基于滑动窗口来辅助流量控制和拥塞控制。所以我们先讲解滑…...
Python学习打卡:day10
day10 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 目录 day1073、文件的读取操作文件的操作步骤open()打开函数mode常用的三种基础访问模式读操作相关方法read()方法readlines()方法readline()方法for循…...
新书速览|Ubuntu Linux运维从零开始学
《Ubuntu Linux运维从零开始学》 本书内容 Ubuntu Linux是目前最流行的Linux操作系统之一。Ubuntu的目标在于为一般用户提供一个最新的、相当稳定的、主要由自由软件构建而成的操作系统。Ubuntu具有庞大的社区力量,用户可以方便地从社区获得帮助。《Ubuntu Linux运…...
[Qt的学习日常]--窗口
前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、窗口的分…...
Vue发送http请求
1.创建项目 创建一个新的 Vue 2 项目非常简单。在终端中,进入您希望创建项目的目录(我的目录是D:\vue),并运行以下命令: vue create vue_test 2.切换到项目目录,运行项目 运行成功后,你将会看到以下的编译成功的提示…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
