我有这个界面:

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的spring使用:@EnableAspectJAutoProxy(proxyTargetClass = true)

我的问题是在执行FakeImpl的doStuffBefore方法之前未调用方面foo()方法。当我将@CustomAnnotation放在FakeImpl而不是FakeTemplate上时,它确实起作用,但是我更喜欢将注释放在FakeTemplate上,因为它在单独的API包中,并且我将其委托为我放置所有注释的地方。

我还想确保在实现CustomAnnotation的每个类上调用FakeTemplate,而不必记住在所有实现类本身上添加注释。

如果注释仅在接口类上,有什么方法可以使建议被调用?

最佳答案

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

10-07 16:15