CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。
通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB 是一个好的选择。
文章目录
- Cglib动态代理
- 前言
- 一、原理
- 二、简单实现Cglib
- 1.导入依赖
- 2.新建目标代理类
- 3.创建代理类Cglib
- 4创建测试:
- 总结
前言
CGLIB 动态代理
JDK的动态代理机制只能代理实现了接口的类。而不能实现接口的类就不能使 用JDK的动态代理,CGLIB是针对类来实现代理的,它的原理是对指定目标类生 成一个子类,并覆盖其中的方法实现增强,但因为采用的是继承,所以不能对 final修饰的类进行代理。
一、原理
实现原理:继承思想:
代理类继承目标类,重写目标类中的方法, CGLIB像是一个拦截器,在调用我们的代理类方法时,代理类(子类)会去找到目标类(父类),此时它会被一个方法拦截器所拦截,在拦截器中才会去实现方法的调用。并且还会对方法进行行为增强。
二、简单实现Cglib 1.导入依赖2.新建目标代理类cglib cglib 3.1
public class userviceImpl{
public void add() {
System.out.println("我是目标代理类");
}
}
3.创建代理类Cglib
创建代理类,里面主要有2个方法,一个为获取代理的实例方法,另一个为需要重写的方法,此类需要实现MethodInterceptor接口,该接口很简单,此包含一个方法intercept:
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class Cglib implements MethodInterceptor {
private Object target;
public Object bind(Object target) {
this.target = target;
Enhancer enhancer = new Enhancer();
// 设置超类方法
enhancer.setSuperclass(this.target.getClass());
// 设置一个回调方法,用来设置哪个类为代理类,this表示当前类为代理类
enhancer.setCallback(this);
// 创建代理对象
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy)
throws Throwable {
System.out.println("CGLIB代理前");
//invokerSuper 或许可以理解为 调用目标对象方法
Object object = proxy.invokeSuper(obj, args);
System.out.println("CGLIB代理后");
return object;
}
}
4创建测试:
@Test
public void cglib01(){
Cglib cglib = new Cglib();
userviceImpl userServiceImpl = (userviceImpl) cglib.bind(new userviceImpl());
userServiceImpl.add();
}
结果截图:
总结
目前主流还是使用Cglib 动态代理比较多 ,所以建议Cglib 要学会,JDK 动态代理也最好掌握
Cglib和jdk动态代理的区别?
1、Jdk动态代理:利用拦截器(必须实现InvocationHandler)加上反射机制 生成一个代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理 2、 Cglib动态代理:利用ASM框架,对代理对象类生成的class文件加载进来, 通过修改其字节码生成子类来处理
什么时候用cglib什么时候用jdk动态代理?
1、目标对象生成了接口 默认用JDK动态代理 2、如果目标对象使用了接口,可以强制使用cglib 3、如果目标对象没有实现接口,必须采用cglib库,Spring会自动在JDK动态代理 和cglib之间转换
JDK动态代理和cglib字节码生成的区别?
1、JDK动态代理只能对实现了接口的类生成代理,而不能针对类 2、Cglib是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法,并覆盖其中方法的增强,但是因为采用的是继承,所以该类或方法最好不要生成final,对于final类或方法,是无法继承的



