Spring AOP:关于注释的建议被另一个建议使用

Spring AOP: Advice on annotation used over another advice

我已经创建了自定义注释:

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Condition {
    String value();
}

我想用这个注解来判断是否给运行建议,我的尝试:

@Condition("some.config")
@Around("execution(public * someMethod())")
Object doSomething(ProceedingJoinPoint joinPoint) throws Throwable {
    // some logic here
}

@Around("@annotation(condition)")
Object checkCondition(ProceedingJoinPoint joinPoint, Condition condition) throws Throwable {
    String property = (String) configuration.getProperty(condition.value());
    if (Boolean.valueOf(property)){
        return joinPoint.proceed();
    } else {
        return null;
    }
}

当我在其他一些方法上使用 @Condition 时它起作用,即应用 checkCondition 然后根据配置值执行或不执行该方法。对于建议 doSomething 它没有得到应用。

您说您的方面适用于其他组件,而不是方面本身。从这个声明中我了解到

  1. 你的方面连接正确(例如用 @Component 注释并通过组件扫描检测或通过 XML 配置手动连接)和
  2. 您使用基于代理的 Spring AOP。

(2) 是您问题的根源。根据 Spring manual 方面本身免于成为方面目标本身:

Advising aspects with other aspects?

In Spring AOP, it is not possible to have aspects themselves be the target of advice from other aspects. The @Aspect annotation on a class marks it as an aspect, and hence excludes it from auto-proxying.

所以 M。 Prokhorov 在说方面不是(或不能是)Spring 组件时有些错误,但他是正确的,因为根据设计你不能自我建议一个方面或建议其他方面。他关于它 可能 与 AspectJ 一起工作的假设也是正确的。它 与 AspectJ 一起工作,因此如果您需要它,您可以配置 Spring 以在这种情况下使用 AspectJ via LTW 而不是 Spring AOP。