aop切面获取继承tkmapper子类上面的类注解

这是我写的第一篇文章,自己还是个小白,有错误的地方可以指出来哟
1.pointcut表达式:execution 用于匹配连接点;annotation 只能匹配到方法上的注解,类上的注解是匹配不到的。

@annotation(com.novacloud.common.annotation.MongoJournal)
execution(* com.novacloud.common.dao..*.*(..))

2.Around是最先执行的,其次是Before,然后根据

Object result = joinPoint.proceed();

执行方法,后面就是After等了。
3.获取切面执行方法

MethodSignature signature = (MethodSignature) joinPoint.getSignature();  
Method method = signature.getMethod();

4.上面的大家应该都接触过或者了解,下面这个是我弄了好久的坑,也是主要内容(我在XXmapper接口上用了注解,但是XXmapper继承了tkmapper,我要做的就是获取XXmapper上的注解),因为继承、代理原因

joinPoint.getTarget()

获取的都是最底层的BaseMapper,无法获取类的信息,但通过强转后的mapper是XXmapper的代理,可以直接使用,通过方法获取信息,如下

Mapper mapper = (Mapper) joinPoint.getTarget();
//获取参数
Object object = joinPoint.getArgs()[0];
//可以直接获取XXmapper想要获取的信息
Object oldObject = mapper.selectByPrimaryKey(object);

所以,获取子类的话是不能通过target入手的,同样通过signature.getMethod()也是不可以的(method同样是底层类的方法,还是获取不到子类的信息),下面就是解决方式:

//获取当前类名
String className = ((Class) AopUtils.getTargetClass(joinPoint.getTarget()).getGenericInterfaces()[0]).getSimpleName();
//获取当前类上的注解
MapperType mapperType = (MapperType) ((Class) AopUtils.getTargetClass(joinPoint.getTarget()).getGenericInterfaces()[0]).getAnnotation(MapperType.class);

你可能感兴趣的:(java,springboot,aop,mapper)