培训中心网站建设方案,如何成为电商,将网站发布到微信小程序怎么做,在线购物网站设计我们在使用mybatis的时候会碰到一些公共添加时间#xff0c;操作人员#xff0c;更新时间、或者一些分页这个使我们如果要去添加每个对应的- service - dao - mapper - xml 这样就造成很多冗余代码#xff0c;那这个时候我们就需要使用一些通用方法#xff0c;统一就行修改…我们在使用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为cglibfalse为jdk代理为true的话会导致拦截不了mybatis的mapper--
aop:aspectj-autoproxy proxy-target-classfalse /
之后就是使用注解去配置拦截进行修改记录的操作
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 iddataLogInterceptor classcom.kingbal.infrastructure.dataLog.dataLogInterceptor /
aop:configaop:pointcut iddataLogInsertPointCut expressionexecution(* com.kingbal.infrastructure.repository.mapper..insert*(..))amp;amp; !execution(* com.kingbal.infrastructure.repository.mapper.ActionMapper.*(..)) /aop:pointcut iddataLogUpdatePointCut expressionexecution(* com.kingbal.infrastructure.repository.mapper..update*(..)) amp;amp; !execution(* com.kingbal.infrastructure.repository.mapper.ActionMapper.*(..)) /aop:pointcut iddataLogDeletePointCut expressionexecution(* com.kingbal.infrastructure.repository.mapper..delete*(..)) amp;amp; !execution(* com.kingbal.infrastructure.repository.mapper.ActionMapper.*(..)) /aop:advisor advice-refdataLogInterceptor pointcut-refdataLogInsertPointCut /aop:advisor advice-refdataLogInterceptor pointcut-refdataLogUpdatePointCut /aop:advisor advice-refdataLogInterceptor pointcut-refdataLogDeletePointCut /
/aop:config2实现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代理。