在理解他们的区别之前,首先要弄清楚什么是代理模型
代理模式:代理类和被代理类实现公共接口(或继承),代理类具有到被代理类的索引,在实际运行时调用代理类的方法AOP通过动态代理实现。一、简单来说:
JDK动态代理只能为实现接口的类生成代理,而不能为类生成代理
CGLIB是类实现代理,主要为指定的类生成子类,并覆盖其中的方法(继承)
二、Spring在选择用JDK还是CGLiB的依据:
)1) Bean实现接口时,Spring使用JDK动态代理
)2)如果Bean没有实现接口,则Spring可以实现使用CGlib
)3)可以强制使用CGlib (在spring配置中使用AOP : AspectJ-autoproxyproxy-target-class=" true "/)
三、CGlib比JDK快?
(1)用CGLib实现动态代理,在CGLib的基础上采用ASM字节码生成框架,用字节码技术生成代理类比用Java反射更有效。 唯一需要注意的是,CGLib无法代理声明为final的方法。 这是因为CGLib原理动态生成被代理类的子类。
)2)在JDK动态代理和CGlib动态代理代码实验中,运行1W次,JDK7和8的动态代理性能比CGlib好20%左右。