版权声明:本文为博主原创文章,转载必须标明出处.尊重他人就是尊重自己! https://blog.csdn.net/Dax1n/article/details/81944975
call 调用通知的环境是方法调用位置;而execution是方法执行位置,也就是方法签名处。
具体结合一个示例可以更简单跟容易理解:
1、pointcut配置:
pointcut callPointCut():execution(public void com.javartisan.aspectj1.HelloWorld.say(String));
此时是执行环境,查看一下被织入切面之后的字节码:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.javartisan.aspectj;
import com.javartisan.aspectj.HelloWorldAspect;
public class HelloWorld {
public HelloWorld() {
}
public void say() {
try {
HelloWorldAspect.aspectOf().ajc$before$com_javartisan_aspectj_HelloWorldAspect$1$88992c11();
System.out.println("Hello World!");
} catch (Throwable var2) {
HelloWorldAspect.aspectOf().ajc$after$com_javartisan_aspectj_HelloWorldAspect$2$88992c11();
throw var2;
}
HelloWorldAspect.aspectOf().ajc$after$com_javartisan_aspectj_HelloWorldAspect$2$88992c11();
}
public static void main(String[] args) {
(new HelloWorld()).say();
}
}
2、pointcut配置
pointcut callPointCut(String name, int age):call(public void com.javartisan.aspectj2.HelloWorld.say(String,int))&&args(name,age);
织入切面的字节码如下:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.javartisan.aspectj;
import com.javartisan.aspectj.HelloWorldAspect;
public class HelloWorld {
public HelloWorld() {
}
public void say() {
System.out.println("Hello World!");
}
public static void main(String[] args) {
HelloWorld var10000 = new HelloWorld();
try {
HelloWorldAspect.aspectOf().ajc$before$com_javartisan_aspectj_HelloWorldAspect$1$88992c11();
var10000.say();
} catch (Throwable var2) {
HelloWorldAspect.aspectOf().ajc$after$com_javartisan_aspectj_HelloWorldAspect$2$88992c11();
throw var2;
}
HelloWorldAspect.aspectOf().ajc$after$com_javartisan_aspectj_HelloWorldAspect$2$88992c11();
}
}
对比1与2可以知晓:
call是在调用处进行织入通知代码,而对于execution是在连接点方法内部织入通知代码。