zm12397
zm12397
采纳率66.7%
2017-12-07 04:03 阅读 6.7k

AOP切mybatis的mapper接口,切不到接口上的annotation

100

如题,一个springboot项目,mapper接口上有自定义的类型级注解PrivateDatasource,
表达式如下:
@Around("execution(* com.nbst.dao.mapper.idevcloudweb.*.*(..)) && @target(privateDatasource)")
切接口是切不到注解,但是自己给一个普通类上加上注解就可以切到,请问有大佬能给解答一下么

切面类:
@Aspect
@Component
public class DataSourceAspect {
@Around("execution(* com.nbst.dao.mapper.idevcloudweb.*.*(..)) && ( @target(privateDatasource) || @annotation(privateDatasource) )")
public Object beforeMapper(ProceedingJoinPoint joinPoint,PrivateDatasource privateDatasource){
Signature sig = joinPoint.getSignature();
String method = sig.getName();
System.out.println("方法名:"+sig.getName());
if(privateDatasource == null){
Object target = joinPoint.getTarget();
privateDatasource = target.getClass().getAnnotation(PrivateDatasource.class);
}
System.out.println(privateDatasource.value());
return null;
}
}
mapper接口:
@PrivateDatasource
public interface CompanyMapper
同一路径下的用于测试的类:
@PrivateDatasource
@Component
public class Test {
public void say(){
System.out.println("test");
}
}
根本切不到带注解的接口,也就是无法注入注解对象作为参数,但是普通类是可以切到、并且将注解对象作为参数注入的

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

10条回答 默认 最新

  • zm12397 zm12397 2017-12-07 05:21

    切面类:
    @Aspect
    @Component
    public class DataSourceAspect {
    @Around("execution(* com.nbst.dao.mapper.idevcloudweb.*.*(..)) && ( @target(privateDatasource) || @annotation(privateDatasource) )")
    public Object beforeMapper(ProceedingJoinPoint joinPoint,PrivateDatasource privateDatasource){
    Signature sig = joinPoint.getSignature();
    String method = sig.getName();
    System.out.println("方法名:"+sig.getName());
    if(privateDatasource == null){
    Object target = joinPoint.getTarget();
    privateDatasource = target.getClass().getAnnotation(PrivateDatasource.class);
    }
    System.out.println(privateDatasource.value());
    return null;
    }
    }
    mapper接口:
    @PrivateDatasource
    public interface CompanyMapper
    同一路径下的用于测试的类:
    @PrivateDatasource
    @Component
    public class Test {
    public void say(){
    System.out.println("test");
    }
    }
    根本切不到带注解的接口,也就是无法注入注解对象作为参数,但是普通类是可以切到、并且将注解对象作为参数注入的

    点赞 1 评论 复制链接分享
  • dcxy0 Q544471255 2017-12-07 04:29

    可以发代码研究下。。。。。。

    点赞 评论 复制链接分享
  • wb_snail wb_snail 2017-12-07 04:34

    springAOP基于动态代理,有两种方式,一种是默认的基于jdk动态代理,这种是不能对接口进行代理的
    还有一种是基于cglib的代理 这种接口也可以代理,我估计你是没有开启cglib代理,就是默认的jdk代理,
    加上这个配置就是强制使用cglib代理

    点赞 评论 复制链接分享
  • wb_snail wb_snail 2017-12-07 04:34

    点赞 评论 复制链接分享
  • wb_snail wb_snail 2017-12-07 04:37

    图片说明
    这段配置加上去试试,默认使用cglib代理的,代码好像贴上去好像不显示

    点赞 评论 复制链接分享
  • zm12397 zm12397 2017-12-07 05:43

    反射打印下发现普通类切到了,而且注解作为参数是可以拿到的
    方法名:say
    注解:@com.nbst.annotation.PrivateDatasource(value=PUBLIC)
    但是接口的还是不行,注解根本注入不进去
    方法名:findByCondition
    注解:null

    点赞 评论 复制链接分享
  • qq_40919850 qq_40919850 2017-12-07 06:35

    springAOP基于动态代理,有两种方式,一种是默认的基于jdk动态代理,这种是不能对接口进行代理的
    还有一种是基于cglib的代理 这种接口也可以代理,我估计你是没有开启cglib代理,就是默认的jdk代理,
    加上这个配置就是强制使用cglib代理

    点赞 评论 复制链接分享
  • cdshiyi 横竖开发创始人 2017-12-07 08:08

    你得吧这个类给ioc容器,就是交给spring管理,也就是@Component,spring才能管理,才会知道给你的切点进行增强处理。

    点赞 评论 复制链接分享
  • u011710489 lblinmi 2018-03-19 10:57

    切不了,源码中明确写了,判断的是target method上的注解,你注解定义在接口上,这个接口的实现类上没用注解,那么就判断这个实现类方法不被拦截,因为一个实现类能够实现多个接口,为了避免多接口方法同注解的情况,aspectjweaver.jar中并没有实现接口方法上注解的处理,你可以自己改写pectjweaver.jar中org.aspectj.weaver.reflect.ReflectionBasedResolvedMemberImpl.unpackAnnotations()方法

    点赞 评论 复制链接分享
  • dagecao dagecao 2021-06-06 16:19

    我也遇到了这样的问题,后来将Spring的jar包升级到了5.1.6 就OK了

    点赞 评论 复制链接分享

相关推荐