我有这个界面:
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}},而不记得将注释放在所有实现类本身上。
如果注释仅在接口类上,有没有办法获得调用的建议?
答案 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上的切入点的执行。