基于 Spring Framework v5.2.6.RELEASE
概述
最近的一系列文章,都在分析基于 JDK 动态代理的 AOP 代理的原理,本片开始分析基于 CGLIB 的 AOP 代理,在之前的文章中已经分析过了,Spring 通过创建一个 ObjenesisCglibAopProxy 并通过它的getProxy方法来创建代理对象,接下来我们开始分析基于 CGLIB 的 AOP 代理对象的原理。
找到执行增强逻辑的拦截器
我们先回顾一下代理对象的创建,Spring 通过 ObjenesisCglibAopProxy 的构造方法来创建,构造方法中会调用父类 CglibAopProxy 的构造方法,其代码如下。
publicCglibAopProxy(AdvisedSupportconfig) throwsAopConfigException { Assert.notNull(config, "AdvisedSupport must not be null"); if (config.getAdvisors().length==0&&config.getTargetSource() ==AdvisedSupport.EMPTY_TARGET_SOURCE) { thrownewAopConfigException("No advisors and no TargetSource specified"); } this.advised=config; this.advisedDispatcher=newAdvisedDispatcher(this.advised); }
参数中传入的对象是增强相关的配置,其中包含了与被代理的目标类型匹配的增强逻辑集合,这个构造方法中,主要的逻辑最后两行的成员变量的初始化。创建完成之后,则会通过 ObjenesisCglibAopProxy 的getProxy
方法创建代理对象。
在 CGLIB 代理中,代理对象是通过 Enhancer 创建的,而 Enhancer 有一个重要的属性callbacks
,它包含了代理对象执行,它是一个 Callback 数组,存放代理的对调逻辑。在创建 AOP 对象时,ObjenesisCglibAopProxy 的父类 CglibAopProxy 中实现的getCallbacks
方法用于根据被代理的类型来获取合适的 Callback 数组。
这个方法的代码比较多,你可以自行去org.springframework.aop.framework.CglibAopProxy
的源码中查看,在这个方法返回的数组中,第一个元素就是一个 DynamicAdvisedInterceptor 类型的对象,它被创建的方式如下:
// Choose an "aop" interceptor (used for AOP calls).CallbackaopInterceptor=newDynamicAdvisedInterceptor(this.advised);
可以从注释上看出,它就是用来处理 AOP 增强的,它的构造方法中,传入了 CglibAopProxy 构造方法中传入的advised
,它在构造方法中的声明类型是 AdvisedSupport,包含了 AOP 相关的配置。
现在可以确定,在基于 CGLIB 的 AOP 代理对象中,请强逻辑就是由它来处理的。下面我们来深入了解一下 DynamicAdvisedInterceptor 这个类。
DynamicAdvisedInterceptor 分析
DynamicAdvisedInterceptor 是 CglibAopProxy 的一个静态内部类,我们先看一下类定义。
/*** General purpose AOP callback. Used when the target is dynamic or when the* proxy is not frozen.*/privatestaticclassDynamicAdvisedInterceptorimplementsMethodInterceptor, Serializable { privatefinalAdvisedSupportadvised; publicDynamicAdvisedInterceptor(AdvisedSupportadvised) { this.advised=advised; } // 省略其他代码}
从类注释中可以看出,它是通用的 AOP 回调,可以再次确认,它就是用来处理 AOP 逻辑的。再看一下它的继承关系。
它的继承结构很简单,只是实现了两个接口,其中,只有 MethodInterceptor 接口中定义了一个intercept
方法。这里要注意的是,这个 MethodInterceptor 与之前分析基于 JDK 动态代理的 AOP 代理对象执行逻辑时见到 MethodInterceptor 并不是一个接口,它们只是名字相同而已。
从 MethodInterceptor 接口的定义中可以知道,代理对象执行 AOP 增强逻辑的执行正式通过它的intercept
方法来完成的。
总结
本文分析了基于 CGLIB 的 AOP 代理对象,是通过一个 DynamicAdvisedInterceptor 类型的 Callback 来完成 AOP 增强逻辑处理的,DynamicAdvisedInterceptor 通过实现 MethodInterceptor 接口的intercept
方法来处理 AOP 增强逻辑。下一篇,将重点分析这个方法的原理。