spring中的Aop大致流程

首先我们先来一个基础类 就是需要被Aop代理的类
在这里插入图片描述
再来一个切面
在这里插入图片描述
加上配置类
在这里插入图片描述
启动类 打上断点 debug执行 f7进入方法中查看
在这里插入图片描述
在这里插入图片描述
我们看一看chain中有什么属性
在这里插入图片描述
ExposeInvocationInterceptor的用处我们等下讲解 继续往下看
进入方法 来执行链式调用 就是我们所说的责任链模式
new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();
在这里插入图片描述
调用父类的proceed方法 看里面是怎么实现的
此次获取的责任链对象是我们的第一个ExposeInterceptor对象 并不是我们自己定义的 我们看一看该对象执行了什么
在这里插入图片描述
在这里插入图片描述
看一看mi.proceed()方法执行的是什么 和刚刚一样的方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
又是和刚刚一样的操作 调用父类的方法 然后获取下一个advice切面
在这里插入图片描述
中间的那些寻找美个切面的方法我们就省略了 完全一样
在这里插入图片描述
在这里插入图片描述
我们进入before的执行方法中去看一看
在这里插入图片描述
在这里插入图片描述
剩下的方法就是帮我们调用我们写入的具体的advice方法来实现Aop操作
执行完了过后继续去寻找下一个切面 因为我们的主方法还没有执行 主要是去执行主方法
在这里插入图片描述
又一次回到这个方法中了 但是此次我们的切面属性已经调用完了 所以直接进入该方法进入
传入我们的原对象 方法和参数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
再
我们看一看字节码文件仔细看一看

public class UserServiceImpl$$EnhancerByCGLIB$$d166e24d extends UserServiceImpl implements Factory {
    private boolean CGLIB$BOUND;
    public static Object CGLIB$FACTORY_DATA;
    private static final ThreadLocal CGLIB$THREAD_CALLBACKS;
    private static final Callback[] CGLIB$STATIC_CALLBACKS;
    private MethodInterceptor CGLIB$CALLBACK_0;
    private static Object CGLIB$CALLBACK_FILTER;
    private static final Method CGLIB$add$0$Method;
    private static final MethodProxy CGLIB$add$0$Proxy;

    final void CGLIB$add$0() { //通过上面方法我们进入到这个方法中 去执行真正的方法
        super.add();
    }

    public final void add() {
        MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;//将我们的切面对象传入
        if(this.CGLIB$CALLBACK_0 == null) {
            CGLIB$BIND_CALLBACKS(this);
            var10000 = this.CGLIB$CALLBACK_0;
        }

        if(var10000 != null) {//这里就到了我们最开始的intercept方法中去了
            var10000.intercept(this, CGLIB$add$0$Method, CGLIB$emptyArgs, CGLIB$add$0$Proxy);
        } else {
            super.add();
        }
    }
    public UserServiceImpl$$EnhancerByCGLIB$$d166e24d() {
        CGLIB$BIND_CALLBACKS(this);
    }

    public static void CGLIB$SET_THREAD_CALLBACKS(Callback[] var0) {
        CGLIB$THREAD_CALLBACKS.set(var0);
    }

    public static void CGLIB$SET_STATIC_CALLBACKS(Callback[] var0) {
        CGLIB$STATIC_CALLBACKS = var0;
    }

    private static final void CGLIB$BIND_CALLBACKS(Object var0) {
        UserServiceImpl$$EnhancerByCGLIB$$d166e24d var1 = (UserServiceImpl$$EnhancerByCGLIB$$d166e24d)var0;
        if(!var1.CGLIB$BOUND) {
            var1.CGLIB$BOUND = true;
            Object var10000 = CGLIB$THREAD_CALLBACKS.get();
            if(var10000 == null) {
                var10000 = CGLIB$STATIC_CALLBACKS;
                if(CGLIB$STATIC_CALLBACKS == null) {
                    return;
                }
            }

            var1.CGLIB$CALLBACK_0 = (MethodInterceptor)((Callback[])var10000)[0];
        }

    }

    public Object newInstance(Callback[] var1) {
        CGLIB$SET_THREAD_CALLBACKS(var1);
        UserServiceImpl$$EnhancerByCGLIB$$d166e24d var10000 = new UserServiceImpl$$EnhancerByCGLIB$$d166e24d();
        CGLIB$SET_THREAD_CALLBACKS((Callback[])null);
        return var10000;
    }

    public Object newInstance(Callback var1) {
        CGLIB$SET_THREAD_CALLBACKS(new Callback[]{var1});
        UserServiceImpl$$EnhancerByCGLIB$$d166e24d var10000 = new UserServiceImpl$$EnhancerByCGLIB$$d166e24d();
        CGLIB$SET_THREAD_CALLBACKS((Callback[])null);
        return var10000;
    }

    public Object newInstance(Class[] var1, Object[] var2, Callback[] var3) {
        CGLIB$SET_THREAD_CALLBACKS(var3);
        UserServiceImpl$$EnhancerByCGLIB$$d166e24d var10000 = new UserServiceImpl$$EnhancerByCGLIB$$d166e24d;
        switch(var1.length) {
        case 0:
            var10000.<init>();
            CGLIB$SET_THREAD_CALLBACKS((Callback[])null);
            return var10000;
        default:
            throw new IllegalArgumentException("Constructor not found");
        }
    }

    public Callback getCallback(int var1) {
        CGLIB$BIND_CALLBACKS(this);
        MethodInterceptor var10000;
        switch(var1) {
        case 0:
            var10000 = this.CGLIB$CALLBACK_0;
            break;
        default:
            var10000 = null;
        }

        return var10000;
    }

    public void setCallback(int var1, Callback var2) {
        switch(var1) {
        case 0:
            this.CGLIB$CALLBACK_0 = (MethodInterceptor)var2;
        default:
        }
    }

    public Callback[] getCallbacks() {
        CGLIB$BIND_CALLBACKS(this);
        return new Callback[]{this.CGLIB$CALLBACK_0};
    }

    public void setCallbacks(Callback[] var1) {
        this.CGLIB$CALLBACK_0 = (MethodInterceptor)var1[0];
    }

    static {
        CGLIB$STATICHOOK1();
    }
}

至于为什么要再字节码中使用 而不直接反复继承添加属性 那么你可以去看一看代理模式
执行完了过后 我们一步一步的返回之前的方法中继续执行我们之前没有完成的切面
我画一张图来描述以下我们刚刚的流程
在这里插入图片描述
一步一步的执行下去 当某些方法可以执行的时候就调用执行 如果需要方法执行后才能执行的话 那么就方法执行完返回上一层的时候执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值