aspectj:为什么建议无法应用?

时间:2012-08-21 11:02:13

标签: java aspectj

我创建了非常基本的aspectJ项目。我不知道为什么不能应用建议。

注释

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.METHOD)  
@Documented  
public @interface Conditional {  
    String value();  
}  

和aspectJ类:

@Aspect
public class AspectE {

    @Around("call(@Conditional * *.*(..)) && @annotation(conditional)" )
    public Object condition(ProceedingJoinPoint joinPoint, Conditional conditional) throws Throwable {

        System.out.println("entry point says hello!");
        return joinPoint.proceed();
    }
}

主:

public class Main {

    @Conditional("")
    public static void main(String[] args) {
        System.out.println("main good morning");
    }
}

你能告诉我接收这两条消息应该改变什么吗?

3 个答案:

答案 0 :(得分:1)

我认为这是因为call(@Conditional * *.*(..))基本上编织了调用者,在这种特定情况下调用者是命令行,因此没有编织发生。

您可能应该将其更改为执行,这应该可以。

@Around("execution(@Conditional * *.*(..)) && @annotation(conditional)" )

答案 1 :(得分:0)

您应该使用AspectJ weaver将方面AspectE应用于Java类Main。如果您使用的是Maven,我建议您使用aspectj-maven-plugin

答案 2 :(得分:0)

  1. 您的建议必须proceed(conditional),或者,如果您不需要绑定到变量的对象,请删除绑定。

  2. 你的切入点匹配问题是你的应用程序中没有调用main(Java命令行就是这样)的地方,只有执行方法的地方,所以你想改变它切入execution(@Conditional * *.*(..))的部分内容。

  3. 为了简化操作,您可以删除切入点的任何一部分,因为两者都会匹配,而不会通过&&进行冗余连接。

  4. 因此,简单的AspectJ语法中最简单的方面版本是:

    public aspect AspectE {
        Object around() : @annotation(Conditional) {
            System.out.println("entry point says hello!");
            return proceed();
        }
    }