AOP中调用和执行之间的区别
我试图尽可能简单地理解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"); } }
如果我们再次查看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