我试图尽可能简单地理解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");
}
}
答案 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