Aspectj中call与execution区别,织入代码位置不同

版权声明:本文为博主原创文章,转载必须标明出处.尊重他人就是尊重自己! 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是在连接点方法内部织入通知代码。

猜你喜欢

转载自blog.csdn.net/Dax1n/article/details/81944975