0

代理模式

2024.09.11 | cuithink | 1025次围观

9. 代理模式

对一个对象提供一个代理对象,使用代理对象控制对原对象的引用。透明的控制对象的访问 , 代理模式的作用是隐藏对象的复杂性,控制对对象的访问,并在必要时增加一些额外的功能。

静态代理与动态代理的区别

  • 实现方式不同:

静态代理是在编译期就已经确定代理对象的类型,代理类需要手动编写。而动 态代理是在运行时动态生成代理对象,代理类不需要手动编写,而是由框架自动生成。

  • 适用范围不同:

静态代理只适用于代理对象类型固定、接口较少的情况下。因为每增加一个被 代理的接口,就需要编写一个新的代理类。而动态代理则可以代理任意的接 口,无需编写新的代理类,因此更加灵活。

  • 性能表现不同:

由于静态代理在编译期就已经确定代理对象的类型,因此在运行时执行效率较 高。而动态代理在运行时需要进行额外的代理对象生成、方法调用转发等操 作,因此会存在一定的性能损失。

总的来说,静态代理适用于代理对象类型固定、接口较少、性能要求较高的情况。而动态代理则适用于代理对象类型不固定、接口较多、灵活性要求较高的情况

JDK动态代理与CGLIB动态代理的区别?

JDK动态代理和CGLIB动态代理是Java语言中实现动态代理的两种方式。它们之 间的主要区别如下:

1. 基于的技术不同:JDK动态代理是基于Java的反射机制实现的,而CGLIB动态代理则是使用字节码生成技术实现的。

2. 被代理类的要求不同:JDK动态代理只能代理实现了接口的类,而CGLIB动态代理可以代理没有实现接口的类。

3. 代理性能不同:JDK动态代理生成的代理类性能相对较低,因为它是基于反射实现的,而CGLIB动态代理生成的代理类性能相对较高,因为它是基于字节码生成技术实现的。

4. 代理方式不同:JDK动态代理是基于接口实现的,因此代理类必须实现被代理接口,而CGLIB动态代理是基于继承实现的,因此代理类继承被代理类。

综上所述,JDK动态代理适合代理接口方法,而CGLIB动态代理适合代理普通类方法。如果被代理类实现了接口,那么优先选择JDK动态代理;如果被代理类没有实现接口,那么只能使用CGLIB动态代理。

CGLIB

  • 最底层是字节码

  • ASM是操作字节码的工具

  • cglib基于ASM字节码工具操作字节码(即动态生成代理,对方法进行增强)

  • SpringAOP基于cglib进行封装,实现cglib方式的动态代理

粤ICP备16076548号
发表评论