如果使用泛型覆盖抽象方法,则Spring AOP @Around注释会调用两次

时间:2017-08-04 14:52:18

标签: java spring generics aspectj spring-aop

我有一个@Around注释处理器,它扩展了一个基类,它有一些注释处理方法。基类采用一些泛型类类型,因此它可以在一些受保护的方法和抽象方法定义中使用它们。

如果抽象方法(在子类中使用@Around注释修饰)在其定义中使用了一个泛型类型,那么子类实现将被调用两次。

基础抽象类:

public abstract class AnnotationProcessor<TargetType, AnnotationType extends Annotation> {

    public abstract Object processAnnotation(ProceedingJoinPoint joinPoint, TargetType targetType) throws Throwable;

    protected AnnotationType getAnnotationSettings(JoinPoint joinPoint, Class<AnnotationType> type) throws AnnotationProcessingException
    {
        //...elided... do some stuff
    }
}

子类:

@Aspect
@Component
public class SubProcessing extends AnnotationProcessor<HasSomeInfo, MyAnnotation> {

    @Override
    @Around("@annotation(MyAnnotation) && target(hasSomeInfo)")
    public Object processAnnotation(ProceedingJoinPoint joinPoint, HasSomeInfo hasSomeInfo) throws Throwable
    {
        //Run their method
        Object methodReturn = joinPoint.proceed();

        //Get the annotation so we can use its values
        MyAnnotation annotation = getAnnotationSettings( joinPoint, MyAnnotation.class);

        System.out.println( "Called " + hasSomeInfo.getInfo() );
        System.out.println( annotation.value());

        //We're not changing the return
        return methodReturn;
    }
}

如果我将抽象类更改为不包含TargetType并删除抽象方法,则只调用一次。

如何保留基类的泛型和抽象方法,但阻止它被调用两次?

注意:我也尝试过以下操作,但它仍然被调用了两次:

@Around("execution(* *(..)) && @annotation(MyAnnotation) && target(hasSomeInfo)")

0 个答案:

没有答案