【问题标题】:Spring AOP: Advice on annotation used over another adviceSpring AOP:关于在另一个建议上使用的注释的建议
【发布时间】:2018-07-26 03:44:10
【问题描述】:

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

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

我想用这个注解来判断是否运行advice,我试试:

@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 的建议,但它没有得到应用。

【问题讨论】:

  • 你是什么意思“不为建议工作”?分享minimal reproducible example代码。
  • 我已更新问题以澄清。
  • 如果那是您的自定义注解,除了您自己的代码之外一无所知,为什么要应用它?
  • 可能是因为这都是我自己的代码?你为什么这么咄咄逼人?我只是 spring-aop 的新手,并试图弄乱它。
  • 激进与否,为什么你认为你自己的自定义注释会对一无所知的代码产生任何影响,而无需你编写代码?。 Spring AOP 通知本身也不是 Spring 组件,因此不考虑布线。一般来说,它也可以像 aspectJ 那样工作,否则过于笼统的切入点会进入无限循环。

标签: java spring spring-aop java-annotations


【解决方案1】:

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

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

在 (2) 中是您的问题的根源。根据Spring manual,切面本身不受切面目标的约束:

建议方面与其他方面?

在 Spring AOP 中,不可能让切面本身成为其他切面的建议目标。类上的 @Aspect 注释将其标记为方面,因此将其排除在自动代理之外。

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

【讨论】:

  • 由于最初的目标只是基于某些配置属性启用或禁用方面,因此this question and answer 也很有帮助。
  • 是的,对于 Spring AOP,基于@ConditionalOnExpression 的解决方案似乎是实现这一目标的好方法。不过,我不是 Spring 用户,所以通常我正在寻找独立于 Spring 的解决方案。如果它真的只是基于条件启用/禁用一个方面,几年前我展示了如何做到这一点dynamically via JMX。 AspectJ 中使用的 if() 切入点在 Spring AOP 中不可用。如果不需要切换到 AspectJ,则可以直接在代码中将其替换为 if 表达式。
猜你喜欢
  • 2011-03-19
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多