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 上的切入点的执行。
我有这个界面:
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 上的切入点的执行。