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

Spring aspect call on custom annotation on interface method

我有这个界面:

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} {

    }

}

我正在使用 spring 启用 AspectJ 使用:@EnableAspectJAutoProxy(proxyTargetClass = true)

我的问题是方面 doStuffBefore 方法在执行 FakeImpl 的 foo() 方法之前没有被调用。当我将 @CustomAnnotation 放在 FakeImpl 而不是 FakeTemplate 上时它确实有效,但我更愿意将注释放在 FakeTemplate 上,因为它位于单独的 [=37] =] 包,我有点委托它作为我放置所有注释的地方。

我还想确保在实现 FakeTemplate 的每个 class 上调用 CustomAnnotation,而不记得在所有实现上添加注释 class es 自己。

如果注释仅在接口 class 上,是否有任何方法可以调用要调用的建议?

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

有一种解决方法。在您的示例中,您可以添加一个额外的 'default' 方法,例如将 fooFacade 命名为您的 FakeTemplate 接口,使用您的 @CustomAnnotation 对其进行注释,然后委托给 'real' foo 方法:

public interface FakeTemplate {

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

    void foo();
}

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