Java三种署理 模式详解:静态署理 、动态署理 和CGLIB署理

[复制链接]
查看319 | 回复0 | 2023-12-6 01:19:03 | 显示全部楼层 |阅读模式
Java三种署理 模式:静态署理 、动态署理 和CGLIB署理
署理 模式
署理 模式是23种设计模式中的一种。署理 模式是一种结构型设计模式,它允许为其他对象提供一个替代品或占位符,以控制对这个对象的拜访 。署理 模式可以在不修改被署理 对象的基础上,通过扩展署理 类,进行一些功能  的附加与增强。
署理 模式的组成
适配器模式一般包含  三种角色:
抽象主题角色(Subject):通过接口或抽象类声明真实角色实现的业务办法 。
署理 主题角色(Proxy):实现抽象角色,是真实角色的署理 (拜访 层),通过真实角色的业务逻辑办法 来实现抽象办法 ,并可以附加自己的操作。
真实主题角色(RealSubject):实现抽象角色,界说 真实角色所要实现的业务逻辑,供署理 角色挪用 。
署理 模式主要有三种形式,分别  是静态署理 、动态署理 (也称JDK署理 、接口署理 )和CGLIB署理 (在内存动态创建  对象而不需要实现接口,也可属于动态署理 得领域 )
静态署理
静态署理 是界说 父类或者接口,然后被署理 对象(即目标对象)与署理 对象一起实现相同的接口或者是继承相同父类。署理 对象与目标对象实现相同的接口,然后通过挪用 相同的办法 来挪用 目标对象的办法 。
优点:可不修改目标对象的功能  ,通过署理 对象对目标功能  扩展。
缺点:因为署理 对象需要与目标对象实现一样的接口,所以会有很多署理 类,一旦接口 增加办法 ,目标对象与署理 对象都要维护。




动态署理
动态署理 是在运行时动态生成署理 类,不需要手动编写署理 类。Java种的动态署理 主要是使用java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler接口实现。
优点:灵活性高、减少重复代码、统一处理  逻辑、可以署理 多个真实类。
缺点:基于反射机制,性能较低,且无法署理 final类和办法 。
动态署理 最主要的就是Proxy.newProxyInstance办法 ,它是用于创建  动态署理 对象的静态办法 。它接受三个参数:
ClassLoader:用于加载动态署理 类的类加载器。
interfaces:要署理 的接口数组。
InvocationHandler:实现了InvocationHandler接口的对象,用于处理  署理 对象的办法 挪用 。








JDK 动态署理 有一个最致命的问题是其只能署理 实现了接口的类。
为了解决这个问题,我们可以用 CGLIB 动态署理 机制来避免。


CGLIB署理
CGLIB署理 也叫作子类署理 ,它使目标对象不需要实现接口,是在内存中构建一个子类对象从而实现对目标对象功能  扩展,有的也将CGLIB署理 归属到动态署理 。
CGLIB是一个高性能的代码生成包,它可以在运行期扩展java类与实现java接口。被许多AOP的框架使用(如Spring AOP)。Cglib包的底层是通过使用字节码处理  框架ASM来转换字节码并生成新的类。
优点:可以为没有实现接口的类提供署理 ;性能比动态署理 更高
缺点:生成的署理 类较年夜 、不支持final办法 和类、对于final类和办法 的处理  相对庞杂 。







CGLIB与java动态署理 的区别
1.实现方法 :
Java动态署理 :使用java.lang.reflect.Proxy和InvocationHandler接口。Java动态署理 只能为接口创建  署理 对象,它是基于接口的署理 。通过Proxy.newProxyInstance()办法 可以动态地生成实现了指定接口的署理 类。
CGLIB:通过继承目标类的方法 创建  署理 对象。CGLIB可以为类创建  署理 ,而不仅仅是接口。它通过生成目标类的子类,在子类中增加署理 逻辑来实现动态署理 。
2.署理 对象类型:
Java动态署理 :只能署理 实现了接口的类。它要求目标对象实现一个或多个接口,然后通过署理 对象来实现这些接口。
CGLIB:可以署理 没有实现任何接口的类。它通过继承目标类来创建  署理 对象,因此目标类不需要实现任何接口。
3.性能:
Java动态署理 :由于生成的署理 对象是基于接口的,因此在挪用 署理 办法 时,会通过接口的办法 挪用 InvocationHandler的invoke办法 ,再由invoke办法 挪用 实际的目标办法 。这一层额外的挪用 可能会引入一些性能开销。
CGLIB:生成的署理 对象是目标类的子类,因此挪用 署理 办法 时,直接挪用 子类中的办法 ,避免了通过接口的中间层,可能会在一些情况下具有更好的性能。
4.结构 方法 :
Java动态署理 :通过Proxy.newProxyInstance()办法 动态生成署理 对象,需要提供一个实现InvocationHandler接口的对象。
CGLIB:通过CGLIB库动态生成署理 对象,无需提供InvocationHandler。CGLIB通过继承目标类并重写其中的办法 来实现署理 逻辑。
应用场景
署理 模式可以在多种场景下使用,包含 但不限于以下几个方面:
1.拜访 控制:署理 模式可以用来控制对实际对象的拜访 权限。比如  ,只有特定用户或角色能力 拜访 某些敏感数据。
2.远程拜访 :署理 模式可以用来处理  远程对象的拜访 。比如  ,通过署理 对象来拜访 远程Web办事 。
3.延迟加载:署理 模式可以用来实现延迟加载。比如  ,通过署理 对象来加载某些资源或数据,以避免在法度模范   启动时就加载所有数据。
4.虚拟署理 :当需要延迟加载或预加载年夜 量数据时,可以使用虚拟署理 来提高法度模范   的性能和效率。
5.缓存署理 :当需要对经常使用的数据进行缓存时,可以使用缓存署理 来治理 和优化数据的拜访 效率。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

17

主题

46

回帖

153

积分

注册会员

Rank: 2

积分
153