首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
一 . 前言
之前说了 AOP初始化 和 AOP 代理类的创建 , 这一篇来看一下 AOP 拦截对象的创建
二 . CglibAopProxy 代理模块
AOP 的主要代理类还是 CglibAopProxy , 所以整体流程还是以该对象为例 :
2.1 拦截对象创建的入口
在 CglibAopProxy # getProxy 主流程中 , 有几个比较重要的逻辑 , 把这几个流程整合后看一下 :
1 | java复制代码// 代码做过一定程度的省略和魔改 |
PIC21001 : Callback[] 系列参数
2.1.1 创建 Callback 对象
1 | java复制代码private Callback[] getCallbacks(Class<?> rootClass) throws Exception { |
PIC21101 advised 中已经包含目标对象和通知面
PIC21102 : mainCallbacks 结构
扩展 : ProxyCallbackFilter 的作用
作用: CallbackFilter为方法分配回调
介绍: 该类实现了一个 Accept 方法 , 用于返回回调函数的索引
1 | java复制代码private static class ProxyCallbackFilter implements CallbackFilter { |
2.1.2 DynamicAdvisedInterceptor
作用 : 当目标是动态的或代理未被冻结时使用 , 会使用该通用的AOP回调
发起 : 从 2.1.1 中 getCallbacks 中可以看到创建流程
1 | java复制代码// 那么来看一下这个对象是如何实现方法的拦截的 |
可以看到 , DynamicAdvisedInterceptor 是 MethodInterceptor 的实现类 , 该接口对方法进行拦截
MethodInterceptor 的继承体系 :
PRO212001 : AdvisedSupport 的作用
作用 : AOP代理配置管理器的基类。其本身不是AOP代理,但是该类的子类通常是工厂,从这些工厂中直接获得AOP代理实例
特点 : 这个类是可序列化的 , 用于保存代理的快
1 | java复制代码 |
代理的核心逻辑 :
对应的方法已经在前面通过 Enhancer 进行 CGLIB 代理了 , 调用时实际调用的是 DynamicAdvisedInterceptor , 再由 DynamicAdvisedInterceptor 完成 AOP 类的调用
PS : 这里涉及到动态代理的相关概念 ,会生成 xxx$$EnhancerBySpringCGLIB$$… 的实际类 , 进行 Class 层面的调用 , 这些后面单独说说
总结
请求方DynamicAdvisedInterceptorCglibMethodInvocation切面请求方调用 Interceptor 对象调用 CglibMethodInvocation 发起切面的调用实际调用到切面对象 , 执行对应的通知方法请求方DynamicAdvisedInterceptorCglibMethodInvocation切面
后续就是 ReflectiveMethodInvocation 调用具体的方法 ,这里先不说
还是感觉没说清楚 , 整个条理不是很清楚 , 考虑整个系列完成后进行一次深入打磨 , 欢迎关注 👉
本文转载自: 掘金