唯一不同的是,CGLib 在初始化被代理类时,是通过 Enhancer 对象把代理对象设置为被代理类的子类,来实现动态代理的 。
因此,被代理类不能被关键字 final 修饰,如果被 final 修饰,再使用 Enhancer 设置父类时会报错,动态代理的构建会失败 。
JDK 动态代理与 CGLib 的区别1. JDK 动态代理具体实现原理
- 通过实现 InvocationHandler 接口,创建自己的调用处理器;
- 通过为 Proxy 类指定 ClassLoader 对象和一组 interface ,来创建动态代理;
- 通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型;
- 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数参入 。
CGLib 是一个强大、高性能的 Code 生产类库,可以实现运行期动态扩展 java 类,Spring 在运行期间通过 CGlib 继承要被动态代理的类,重写父类的方法,实现 AOP 面向切面编程 。
3. 两者对比
- JDK 动态代理是面向接口的 。
- CGLib 动态代理是通过字节码底层继承要代理类来实现(如果被代理类被 final 关键字所修饰,会失败) 。
- CGLib 所创建的动态代理对象,在实际运行时候的性能要比 JDK 动态代理高不少,有研究表明,大概要高出10倍;
- CGLib 在创建对象的时候所花费的时间,比 JDK 动态代理要多很多,有研究表明,大概要高出8倍 。
以上,是关于 Java 动态代理原理、以及动态代理2 种实现方式的解析 。
希望有所帮助,谢谢【关注+点赞+转发】支持 。
作者简介陈睿 | mikechen , 10年+大厂架构经验,「mikechen 的互联网架构」系列文章作者,专注于互联网架构技术 。
阅读「mikechen 的互联网架构」40W 字技术文章合集
Java并发 | JVM | MySQL | Spring | Redis | 分布式 | 高并发
--- end ---
?
经验总结扩展阅读
- 深度剖析Java的volatile实现原理,再也不怕面试官问了
- Spring Cloud 整合 nacos 实现动态配置中心
- 【保姆教程】RuoYi-Radius搭建实现portal认证
- 关于网页实现串口或者TCP通讯的说明
- 你给文字描述,AI艺术作画,精美无比!附源码,快来试试!
- .net core Blazor+自定义日志提供器实现实时日志查看器
- 九 前后端分离项目:实现"添加"功能(后端接口)
- 电脑中随机附带的游戏空当接龙怎么玩(单机游戏空当接龙怎么玩)
- 小样本利器4. 正则化+数据增强 Mixup Family代码实现
- 永动机为什么不能实现