Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringAOP:注释上的建议用于另一个建议_Java_Spring_Spring Aop_Java Annotations - Fatal编程技术网

Java SpringAOP:注释上的建议用于另一个建议

Java SpringAOP:注释上的建议用于另一个建议,java,spring,spring-aop,java-annotations,Java,Spring,Spring Aop,Java Annotations,我已创建自定义批注: @Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Condition { String value(); } 我想使用此批注确定是否运行建议,请尝试: @Condition("some.config") @Around("execution(public * someMeth

我已创建自定义批注:

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

您说过您的方面适用于其他组件,而不是方面本身。从这份声明中,我推断

您的方面连接正确,例如使用@Component进行注释,并通过组件扫描进行检测,或者通过XML配置和手动连接 您使用基于代理的SpringAOP。 第二点是你问题的根源。根据方面本身,这些方面本身免于成为方面目标:

建议方面与其他方面

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


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

什么意思不适用于建议?共享代码。我已经更新了问题以澄清。如果这是您的自定义注释,并且除了您自己的代码之外,没有其他任何东西知道它,为什么会应用它?可能因为这都是我自己的代码?你为什么这么咄咄逼人?我刚刚接触spring aop,并试图将其弄得一团糟。不管是否有进取心,为什么您认为您自己的自定义注释在不编写代码的情况下会对不了解它的代码产生任何影响?。Spring AOP建议本身也不是Spring组件,布线时不考虑。它也可能像aspectJ一般工作,否则过于一般的切入点将进入无限循环。由于最初的目标只是基于某些配置属性启用或禁用方面,因此也非常有用。是的,对于SpringAOP来说,基于@ConditionalOnExpression的解决方案似乎是实现这一点的好方法。不过,我不是Spring用户,所以通常我会寻找与Spring无关的解决方案。如果它真的只是基于一个条件来启用/禁用一个方面,那么几年前我展示了如何做到这一点。SpringAOP中没有AspectJ中使用的if切入点。如果不需要切换到AspectJ,可以直接在代码中用if表达式替换它。