CGLIB动态代理相比于JDK动态代理有什么不同
时间: 2024-06-16 20:04:29 浏览: 186
CGLIB动态代理相比于JDK动态代理有以下不同之处[^1][^2]:
1. 对象类型:JDK动态代理只能基于接口进行代理,生成的代理对象只能赋值给接口变量。而CGLIB动态代理则可以代理普通的类,生成的代理对象既可以赋值给实现类,又可以赋值给接口。
2. 实现方式:JDK动态代理是通过在运行时生成一个实现了代理接口的匿名类来实现的。而CGLIB动态代理是通过生成目标类的子类来实现的,代理对象是目标类的子类对象。
3. 性能:CGLIB动态代理相对于JDK动态代理来说,生成代理对象的速度更快,性能更好。这是因为CGLIB使用了底层的字节码处理框架ASM,直接操作字节码,而JDK动态代理需要通过反射来调用目标方法。
总结来说,CGLIB动态代理相比于JDK动态代理具有更广泛的适用性,可以代理普通类,性能更好。而JDK动态代理则更适合于基于接口的代理。
相关问题
CGLIB动态代理一定比JDK动态代理好?
CGLIB动态代理和JDK动态代理都是常见的Java动态代理技术,它们在实现原理和使用方式上有一些区别。CGLIB动态代理是通过继承目标类来生成代理类,而JDK动态代理是通过实现目标类的接口来生成代理类。
CGLIB动态代理相比JDK动态代理有以下几个优势:
1. 性能更高:CGLIB动态代理在生成代理类时,不需要像JDK动态代理那样通过反射调用目标方法,而是直接调用目标类的方法,因此在性能上更高效。
2. 支持非接口类:CGLIB动态代理可以代理没有实现接口的类,而JDK动态代理只能代理实现了接口的类。
3. 不受final修饰符限制:CGLIB动态代理可以代理被final修饰的类和方法,而JDK动态代理无法代理final修饰的类和方法。
然而,CGLIB动态代理也有一些限制和缺点:
1. CGLIB动态代理生成的代理类是目标类的子类,因此无法代理被final修饰的类和方法。
2. CGLIB动态代理使用字节码生成技术,对于一些复杂的场景可能会导致生成的代理类过于庞大,影响性能和加载速度。
3. CGLIB动态代理需要依赖CGLIB库,而JDK动态代理是Java标准库的一部分,因此在一些特定的环境中可能无法使用CGLIB动态代理。
综上所述,CGLIB动态代理在性能和功能上相对于JDK动态代理有一些优势,但也存在一些限制和缺点。选择使用哪种动态代理技术应根据具体的需求和场景来决定。
mybatis的动态代理是基于jdk动态代理还是cglib动态代理?
Mybatis的动态代理是基于JDK动态代理CGLIB动态代理的结合使用的。具体来说,Mybatis在代理Mapper接口时使用了JDK动态代理,而在处理映射对象的懒加载时使用了CGLIB动态代理。
为什么代理Mapper不使用CGLIB动态代理呢?这是因为Mapper接口通常是基于接口的,而JDK动态代理只能代理接口,所以Mybatis选择了使用JDK动态代理来代理Mapper接口。
为什么处理映射对象的懒加载不使用CGLIB动态代理或者JDK提供的动态代理,而是引入javassist代理库呢?这是因为CGLIB动态代理和JDK动态代理都需要在运行时生成代理类的字节码,而javassist相比其他动态代理库来说更加高效。因此,Mybatis选择了使用javassist代理库来实现对映射对象的懒加载[^1]。
阅读全文