- 动态代理--CGLIB
- 是什么
- CGLIB(Code Generation Library), Code生成类库
- CGLIB动态代理不限定是否具有接口,可以对任意操作进行增强
- CGLIB动态代理无需要原始被代理对象,动态创建出新的代理对象
- CGLIB是一个强大的、高性能的代码生成库
- 其被广泛应用于AOP框架(Spring、dynaop)中,用以提供方法拦截操作
- 为什么用
- CGLIB代理主要通过对字节码的操作,为对象引入间接级别,以控制对象的访问
- 我们知道Java中有一个动态代理也是做这个事情的,那为什么不直接使用Java动态代理,而要使用CGLIB呢?
- 答案是CGLIB相比于JDK动态代理更加强大
- JDK动态代理虽然简单易用,但是其有一个致命缺陷是,只能对接口进行代理
- 如果要代理的类为一个普通类、没有接口,那么Java动态代理就没法使用了
- 在JDK动态代理中提供一个Proxy类来创建代理类,而在CGLib动态代理中也提供了一个类似的类Enhancer
- CGLIB底层使用了ASM(一个短小精悍的字节码操作框架)来操作字节码生成新的类,比使用Java反射效率要高
- 唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类
- 与Java动态代理的区别
- Java动态代理只能够对接口进行代理,不能对普通的类进行代理(因为所有生成的代理类的父类为Proxy,Java类继承机制不允许多重继承);
- CGLIB能够代理普通类;
- Java动态代理使用Java原生的反射API进行操作,在生成类上比较高效;
- CGLIB使用ASM框架直接对字节码进行操作,在类的执行过程中比较高效
- 织入时机
- 编译期
- 运行时速度快
- 灵活性差
- 编译即锁定
- 加载期
- 运行时速度快
- 灵活性中
- 多次加载可变更实现
- 运行期
- 运行时速度慢
- 灵活性强
- 每次运行均可改变实现
本文含有隐藏内容,请 开通VIP 后查看