Spring 源码阅读 71:基于 CGLIB 的 AOP 代理的原理(1)- DynamicAdvisedInterceptor 分析

简介: 【1月更文挑战第6天】本文分析了基于 CGLIB 的 AOP 代理对象,是通过一个 DynamicAdvisedInterceptor 类型的 Callback 来完成 AOP 增强逻辑处理的,DynamicAdvisedInterceptor 通过实现 MethodInterceptor 接口的intercept方法来处理 AOP 增强逻辑。下一篇,将重点分析这个方法的原理。


基于 Spring Framework v5.2.6.RELEASE

相关阅读:Spring 源码阅读 60:通过 JDK 动态代理或者 CGLIB 创建 AOP 代理对象

概述

最近的一系列文章,都在分析基于 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 增强逻辑。下一篇,将重点分析这个方法的原理。


目录
相关文章
|
1月前
|
设计模式 Java Maven
Spring Aop 底层责任链思路实现-springaopdi-ceng-ze-ren-lian-si-lu-shi-xian
Spring Aop 底层责任链思路实现-springaopdi-ceng-ze-ren-lian-si-lu-shi-xian
35 1
|
29天前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
66 1
|
29天前
|
存储 XML 缓存
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南(一)
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南
67 0
|
3天前
|
安全 Java API
Spring工厂API与原理
Spring工厂API与原理
27 10
|
24天前
|
XML Java Maven
Spring之Aop的注解使用
Spring之Aop的注解使用
|
30天前
|
Java Spring
Spring 如何实现 AOP
Spring 如何实现 AOP
17 0
|
30天前
|
XML 缓存 Java
天天用 Spring,bean 实例化原理你懂吗
天天用 Spring,bean 实例化原理你懂吗
17 0
|
1月前
|
Java 编译器 程序员
Spring AOP 和 AspectJ 的比较
Spring AOP 和 AspectJ 的比较
37 0
|
4月前
|
XML Java uml
spring 源码解析——第一篇(ioc xml方式)
spring 源码解析——第一篇(ioc xml方式)
32 0
|
3月前
|
安全 Java 应用服务中间件
阿里技术官架构使用总结:Spring+MyBatis源码+Tomcat架构解析等
分享Java技术文以及学习经验也有一段时间了,实际上作为程序员,我们都清楚学习的重要性,毕竟时代在发展,互联网之下,稍有一些落后可能就会被淘汰掉,因此我们需要不断去审视自己,通过学习来让自己得到相应的提升。