Spring AOP(二):修饰者模式和 JDK Proxy

栏目: Java · 发布时间: 5年前

内容简介:在上边一篇文章中我们介绍了Spring AOP的基本概念,今天我们就来学习一下与AOP实现相关的修饰者模式和Java Proxy相关的原理,为之后源码分析打下基础。Java设计模式中的修饰者模式能动态地给目标对象增加额外的职责(Responsibility)。它使用组合(object composition),即将目标对象作为修饰者对象(代理)的成员变量,由修饰者对象决定调用目标对象的时机和调用前后所要增强的行为。装饰模式包含如下组成部分:

在上边一篇文章中我们介绍了Spring AOP的基本概念,今天我们就来学习一下与AOP实现相关的修饰者模式和Java Proxy相关的原理,为之后源码分析打下基础。

修饰者模式

Java设计模式中的修饰者模式能动态地给目标对象增加额外的职责(Responsibility)。它使用组合(object composition),即将目标对象作为修饰者对象(代理)的成员变量,由修饰者对象决定调用目标对象的时机和调用前后所要增强的行为。

装饰模式包含如下组成部分:

  • Component: 抽象构件,也就是目标对象所实现的接口,有operation函数

  • ConcreteComponent: 具体构件,也就是目标对象的类

  • Decorator: 抽象装饰类,也实现了抽象构件接口,也就是目标类和装饰类都实现了相同的接口

  • ConcreteDecorator: 具体装饰类,其中addBeavior函数就是增强的行为,装饰类可以自己决定addBeavior函数和目标对象函数operation函数的调用时机。

Spring AOP(二):修饰者模式和 JDK Proxy

修饰者模式调用的时序图如下图所示。程序首先创建目标对象,然后创建修饰者对象,并将目标对象传入作为其成员变量。当程序调用修饰者对象的operation函数时,修饰者对象会先调用目标对象的operation函数,然后再调用自己的addBehavior函数。这就是类似于AOP的后置增强器,在目标对象的行为之后添加新的行为。

Spring AOP(二):修饰者模式和 JDK Proxy

Spring AOP的实现原理和修饰者模式类似。在上一篇文章中说到AOP的动态代理有两种实现方式,分别是JDK Proxy和cglib。

如下图所示,JDK Proxy的类结构和上文中修饰者的类图结构类似,都是代理对象和目标对象都实现相同的接口,代理对象持有目标对象和切面对象,并且决定目标函数和切面增强函数的调用时机。 而cglib的实现略有不同,它没有实现实现相同接口,而是代理对象继承目标对象类。 Spring AOP(二):修饰者模式和 JDK Proxy

本文后续就讲解一下JDK Proxy的相关源码分析。

JDK Proxy

JDK提供了Proxy类来实现动态代理的,可通过它的newProxyInstance函数来获得代理对象。JDK还提供了InvocationHandler类,代理对象的函数被调用时,会调用它的invoke函数,程序员可以在其中实现所需的逻辑。

JDK Proxy的基本语法如下所示。先构造一个 InvocationHandler 的实现类,然后调用  Proxy 的  newProxyInstance 函数生成代理对象,传入类加载器,目标对象的接口和自定义的  InvocationHandler 实例。

生成代理对象

我们首先来看一下 Proxy 的  newProxyInstance 函数。  newProxyInstance 函数的逻辑大致如下:

  • 首先根据传入的目标对象接口动态生成代理类

  • 然后获取代理类的构造函数实例

  • 最后将  InvocationHandler 作为参数通过反射调用构造函数实例,生成代理类对象。 具体源码如下所示。

getProxyClass0 函数的源码如下所示,通过代理类缓存获取代理类信息,如果不存在则会生成代理类。

生成代理类

JDK Proxy通过 ProxyClassFactory 生成代理类。其  apply 函数大致逻辑如下:

  • 校验接口是否符合规范

  • 生成代理类的名称和包名

  • 生成代理类字节码

  • 根据字节码生成代理类Class

其中关于字节码生成的部分逻辑我们就暂时不深入介绍了,感兴趣的同学可以自行研究。

$Proxy反编译

我们来看一下生成的代理类的反编译代码。代理类实现了 Object 的基础函数,比如  toString 、  hasCode 和  equals ,也实现了目标接口中定义的函数,比如说  ProxyTest 接口的  test 函数。

$Proxy 中函数的实现都是直接调用了  InvocationHandler 的  invoke 函数。

后记

下一篇文章就是AOP的源码分析了,希望大家继续关注。

Spring AOP(二):修饰者模式和 JDK Proxy


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

轻营销

轻营销

唐文 / 机械工业出版社 / 2015-6 / 35元

《轻营销》,中国第一本全面讲述如何在互联网新时代用小预算做大营销的书籍,以求把中小微企业从那些以大预算为基础而难以落地的营销理论和案例中解脱出来。用“轻”但真正起作用的方法,帮助传统企业抓住互联网新一波浪潮的机遇,转型升级。 “怒打价格战、拼命砸广告、渠道金字塔”是过去中国企业做营销的基本功课,背后的逻辑是花钱。今天这三招已经不太管用了,广告费用的多少不再是决定性因素。取而代之的是直面客户的......一起来看看 《轻营销》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

MD5 加密
MD5 加密

MD5 加密工具