AOP中调用和执行之间的区别

时间:2014-12-09 10:23:16

标签: java aop aspectj

我试图尽可能简单地理解AOP中执行和调用之间的区别。根据我收集的内容,execution()将在执行代码中添加一个连接点,在这种情况下为HelloWorldSayer.sayHello(),但如果切入点为call(),则连接点将为HelloWorldSayer.main() 。这是对的吗?

public class HelloWorldSayer {
    public static void main (String[] args) {
        sayHello();
    }

    public static void sayHello() {
        System.out.println("Hello");
    }
}

public aspect World {
    public hello():
        execution(static void HelloWorldSayer.sayHello());

    after() hello() {
        System.out.println("Bye");
    }
}

1 个答案:

答案 0 :(得分:3)

如果我们再次查看HelloWorldSayer类,则会有4个连接点阴影(2个执行切入点和2个调用切入点)。

换句话说,public static void main (String[] args)public static void sayHello()指的是执行切入点。 (HelloWorldSayer.)sayHello();System.out.println("Hello");指的是呼叫切入点。

如果您按如下方式更改声明的切入点,则切入点会选择sayHello();

public pointcut hello():
    call(static void HelloWorldSayer.sayHello());

另一方面,您更改声明的切入点,如下所示,切入点选择sayHello方法声明public static void sayHello()

public pointcut hello():
    execution(static void HelloWorldSayer.sayHello());

最后,请阅读此答案,以便更好地了解call()execution()https://stackoverflow.com/a/18149106/904745