Spring 方面调用接口方法上的自定义注释

问题描述 投票:0回答:3

我有这个界面:

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 spring interface annotations spring-aop
3个回答
5
投票

注解继承不适用于java中的方法。 但是您可以使用其他切入点表达式,例如

execution(public * FakeTemplate+.foo(..))


0
投票

有一种解决方法。在您的示例中,您可以添加额外的“默认”方法,例如将 fooFacade 命名为 FakeTemplate 接口,使用 @CustomAnnotation 对其进行注释,然后委托给“真正的”foo 方法:

public interface FakeTemplate {

    @CustomAnnotation
    default void fooFacade() {
        foo();
    }

    void foo();
}

现在每当你调用 fooFacade() 时,都会触发 @CustomAnnotation 上的切入点的执行。


© www.soinside.com 2019 - 2024. All rights reserved.