gpt4 book ai didi

java - Spring AOP : Advice on annotation used over another advice

转载 作者:行者123 更新时间:2023-12-02 11:37:46 26 4
gpt4 key购买 nike

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

@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,它并没有得到应用。

最佳答案

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

  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 组件时有点错误,但他是对的,因为从设计上来说,您无法 self 建议某个方面或建议其他方面。他关于它可能与 AspectJ 一起工作的假设也是正确的。它确实与AspectJ一起工作,所以如果你需要它,你可以配置Spring使用AspectJ via LTW对于这种情况,而不是 Spring AOP。

关于java - Spring AOP : Advice on annotation used over another advice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48806322/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com