附:2种实现方式详细对比 Java 动态代理原理图解( 三 )


唯一不同的是,CGLib 在初始化被代理类时,是通过 Enhancer 对象把代理对象设置为被代理类的子类,来实现动态代理的 。
因此,被代理类不能被关键字 final 修饰,如果被 final 修饰,再使用 Enhancer 设置父类时会报错,动态代理的构建会失败 。
JDK 动态代理与 CGLib 的区别1.  JDK 动态代理具体实现原理

  • 通过实现 InvocationHandler 接口,创建自己的调用处理器;
  • 通过为 Proxy 类指定 ClassLoader 对象和一组 interface ,来创建动态代理;
  • 通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型;
  • 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数参入 。
2.  CGLib 动态代理
CGLib 是一个强大、高性能的 Code 生产类库,可以实现运行期动态扩展 java 类,Spring 在运行期间通过 CGlib 继承要被动态代理的类,重写父类的方法,实现 AOP 面向切面编程 。
3.  两者对比
  • JDK 动态代理是面向接口的 。
  • CGLib 动态代理是通过字节码底层继承要代理类来实现(如果被代理类被 final 关键字所修饰,会失败) 。
4.  性能对比
  • CGLib 所创建的动态代理对象,在实际运行时候的性能要比 JDK 动态代理高不少,有研究表明,大概要高出10倍;
  • CGLib 在创建对象的时候所花费的时间,比 JDK 动态代理要多很多,有研究表明,大概要高出8倍 。
因此,对于 singleton 的代理对象或者具有实例池的代理,因为无需频繁的创建代理对象,更适合采用 CGLib 动态代理,反之,则比较适用 JDK 动态代理 。
以上,是关于 Java 动态代理原理、以及动态代理2 种实现方式的解析 。
希望有所帮助,谢谢【关注+点赞+转发】支持 。
作者简介陈睿 | mikechen , 10年+大厂架构经验,「mikechen 的互联网架构」系列文章作者,专注于互联网架构技术 。
阅读「mikechen 的互联网架构」40W 字技术文章合集
Java并发 | JVM | MySQL | Spring | Redis | 分布式 | 高并发
--- end ---
?

经验总结扩展阅读