Spring方面调用接口方法上的自定义注释

时间:2016-03-17 15:54:55

标签: java spring interface annotations spring-aop

我有这个界面:

public interface FakeTemplate {

    @CustomAnnotation
    void foo() {

    }

}

这个接口的实现:

@Component
public FakeImpl implements FakeTemplate {

    @Override
    public void foo() {
        //Do Stuff
    }

}

这方面:

@Aspect
@Component
public class CustomAspect {

    @Before(value = "@annotation(com.fake.CustomAnnotation)")
    public void doStuffBefore(JoinPoint joinPoint} {

    }

}

我使用弹簧启用了AspectJ,使用:@EnableAspectJAutoProxy(proxyTargetClass = true)

我的问题是在执行FakeImpl的doStuffBefore方法之前没有调用方面foo()方法。当我将@CustomAnnotation放在FakeImpl上而不是FakeTemplate时,它会起作用,但我更倾向于将注释放在FakeTemplate上,因为它是CustomAnnotation在一个单独的API包中,我将它委托给我放置所有注释的地方。

我还想确保在每个实现FakeTemplate的类上调用{{1}},而不记得将注释放在所有实现类本身上。

如果注释仅在接口类上,有没有办法获得调用的建议?

2 个答案:

答案 0 :(得分:2)

注释继承不适用于java中的方法。 但你可以使用其他切入点表达式 execution(public * FakeTemplate+.foo(..))

答案 1 :(得分:0)

有一种解决方法。在您的示例中,您可以添加其他“默认”方法,例如将名称fooFacade命名为FakeTemplate接口,并使用@CustomAnnotation对其进行注释,然后委托给“真实的” foo方法:

public interface FakeTemplate {

    @CustomAnnotation
    default void fooFacade() {
        foo();
    }

    void foo();
}

现在,每当调用fooFacade()时,都会触发@CustomAnnotation上的切入点的执行。