[英]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} {
}
}
我正在使用启用了 AspectJ 的 spring: @EnableAspectJAutoProxy(proxyTargetClass = true)
我的问题是在执行 FakeImpl 的foo()
方法之前没有调用方面doStuffBefore
方法。 当我将@CustomAnnotation
放在FakeImpl
而不是@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 上的切入点的执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.