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 Spring
Spring之Aop的底层原理
Spring之Aop的底层原理
|
2月前
|
设计模式 前端开发 Java
【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究SpringMVC的核心原理和运作机制(总体框架原理篇)
【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究SpringMVC的核心原理和运作机制(总体框架原理篇)
34 0
|
2月前
|
XML Java Shell
【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究Spring的核心注解开发和实现指南(Spring5的常见的注解)
【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究Spring的核心注解开发和实现指南(Spring5的常见的注解)
21 1
|
2月前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
81 1
|
2月前
|
XML 存储 缓存
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache管理器的实战开发指南(修正篇)
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache管理器的实战开发指南(修正篇)
35 0
|
2天前
|
监控 安全 Java
Spring cloud原理详解
Spring cloud原理详解
14 0
|
8天前
|
Java 开发者 微服务
Spring Cloud原理详解
【5月更文挑战第4天】Spring Cloud是Spring生态系统中的微服务框架,包含配置管理、服务发现、断路器、API网关等工具,简化分布式系统开发。核心组件如Eureka(服务发现)、Config Server(配置中心)、Ribbon(负载均衡)、Hystrix(断路器)、Zuul(API网关)等。本文讨论了Spring Cloud的基本概念、核心组件、常见问题及解决策略,并提供代码示例,帮助开发者更好地理解和实践微服务架构。此外,还涵盖了服务通信方式、安全性、性能优化、自动化部署、服务网格和无服务器架构的融合等话题,揭示了微服务架构的未来趋势。
32 6
|
13天前
|
负载均衡 Java 开发者
Spring Cloud:一文读懂其原理与架构
Spring Cloud 是一套微服务解决方案,它整合了Netflix公司的多个开源框架,简化了分布式系统开发。Spring Cloud 提供了服务注册与发现、配置中心、消息总线、负载均衡、熔断机制等工具,让开发者可以快速地构建一些常见的微服务架构。
|
18天前
|
存储 缓存 Java
【spring】06 循环依赖的分析与解决
【spring】06 循环依赖的分析与解决
9 1
|
18天前
|
安全 Java API
Spring工厂API与原理
Spring工厂API与原理
35 10