我有这个界面:
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(..))
有一种解决方法。在您的示例中,您可以添加额外的“默认”方法,例如将 fooFacade 命名为 FakeTemplate 接口,使用 @CustomAnnotation 对其进行注释,然后委托给“真正的”foo 方法:
public interface FakeTemplate {
@CustomAnnotation
default void fooFacade() {
foo();
}
void foo();
}
现在每当你调用 fooFacade() 时,都会触发 @CustomAnnotation 上的切入点的执行。