繁体   English   中英

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

    }

}

我正在使用启用了 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM