需求:每次删除A表的数据,我们都希望去保留数据,记录到B表。
很多时候我们是这么做的
public void delete(id) {
UserLogMapper.insert(UserBean);//记录日志
UserMapper.delete(id);//删除记录
}
这样还得要加上事务,什么的。但是别忘记了,UserMapper里的方法如果在别的地方调用了,别人也不知道你的业务逻辑,直接调用UserMapper.delete(id);而没有记录日志。那么就破坏了原有的业务逻辑。
所以我们是在别人调用UserMapper.delete(id);之前调用UserLogMapper.insert(UserBean);。我们想到了AOP
现在我们用AOP,无侵入方式解决这个问题。
思路:用SpringAOP
我们已经有一个mapper类(mybatis)如下:
public interface UserMapper{
int delete(@Param("id") Long id);
}
超级普通的,mybatis这样的接口,用代理去实现。我们也能对这个接口的方法进行拦截。mybatis xml 如下:
<delete id="delete" parameterType="java.lang.Long">
delete from user
where id=#{id,jdbcType=BIGINT}
</delete>
1、建一个注释
import java.lang.annotation.*;
@Target(ElementType.METHOD) //支持注解在方法上
@Retention(RetentionPolicy.RUNTIME) //支持运行时可用
@Documented //DOC文档可见
@Inherited
public @interface DatabaseAfterAspects {
Class processorClass();//调用方法前先调用这个类
String method();//调用这个类的这个方法
}
2、AOP切面,这个切面拦截以上的注释的方法后,调用注释传进来的类和方法
package com.ea.utils.aop;
import com.ea.utils.SpringC