【问题标题】:Spring aspect call on custom annotation on interface methodSpring方面调用接口方法上的自定义注释
【发布时间】:2016-03-17 15:54:54
【问题描述】:

我有这个界面:

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 而不是FakeTemplate 上时,它确实有效,但我更喜欢将注释放在FakeTemplate 上,因为它位于单独的API 包中,并且我已经将其委托为我放置所有注释的地方。

我还想确保在实现FakeTemplate 的每个类上调用CustomAnnotation,而不记得将注释放在所有实现类本身上。

如果注解仅在接口类上,有什么方法可以调用通知?

【问题讨论】:

  • 不是真的,@RahulSharma,它绝对是相似的,但我不想在方面指定接口。我希望能够在任何接口上抛出注释,并让注释所在的任何接口的所有实现类都运行该建议。我不想不断地向方面添加接口规范。

标签: java spring interface annotations spring-aop


【解决方案1】:

注解继承不适用于 java 中的方法。 但是您可以使用其他切入点表达式,例如 execution(public * FakeTemplate+.foo(..))

【讨论】:

  • 是的,这就是我试图避免的。我想在多个接口上使用注释,所以我必须不断地向方面添加新接口。我只是将注释添加到实现类中,这使我的方面保持简单,并且虽然重复工作,但对我来说最有意义。将您的答案标记为正确。
【解决方案2】:

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

public interface FakeTemplate {

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

    void foo();
}

现在,无论何时调用 fooFacade(),都会触发 @CustomAnnotation 上切入点的执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2019-12-24
    相关资源
    最近更新 更多