如题,一个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");
}
}
根本切不到带注解的接口,也就是无法注入注解对象作为参数,但是普通类是可以切到、并且将注解对象作为参数注入的
可以发代码研究下。。。。。。
springAOP基于动态代理,有两种方式,一种是默认的基于jdk动态代理,这种是不能对接口进行代理的
还有一种是基于cglib的代理 这种接口也可以代理,我估计你是没有开启cglib代理,就是默认的jdk代理,
加上这个配置就是强制使用cglib代理
这段配置加上去试试,默认使用cglib代理的,代码好像贴上去好像不显示
切面类:
@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");
}
}
根本切不到带注解的接口,也就是无法注入注解对象作为参数,但是普通类是可以切到、并且将注解对象作为参数注入的
反射打印下发现普通类切到了,而且注解作为参数是可以拿到的
方法名:say
注解:@com.nbst.annotation.PrivateDatasource(value=PUBLIC)
但是接口的还是不行,注解根本注入不进去
方法名:findByCondition
注解:null
springAOP基于动态代理,有两种方式,一种是默认的基于jdk动态代理,这种是不能对接口进行代理的
还有一种是基于cglib的代理 这种接口也可以代理,我估计你是没有开启cglib代理,就是默认的jdk代理,
加上这个配置就是强制使用cglib代理
你得吧这个类给ioc容器,就是交给spring管理,也就是@Component,spring才能管理,才会知道给你的切点进行增强处理。
切不了,源码中明确写了,判断的是target method上的注解,你注解定义在接口上,这个接口的实现类上没用注解,那么就判断这个实现类方法不被拦截,因为一个实现类能够实现多个接口,为了避免多接口方法同注解的情况,aspectjweaver.jar中并没有实现接口方法上注解的处理,你可以自己改写pectjweaver.jar中org.aspectj.weaver.reflect.ReflectionBasedResolvedMemberImpl.unpackAnnotations()方法
我也遇到了这样的问题,后来将Spring的jar包升级到了5.1.6 就OK了