CGlib简介
Code Generation Library的简称,一个开源项目,一个强大、高性能、高质量代码生成类库。可以在运行期扩展和增强Java类。Hibernate用它来实现持久对象的字节码动态生成,Spring用它来实现AOP编程。
CGlib动态代理的实现
为什么用CGlib
因为jdk动态代理的实现必须要求代理类和目标类实现相同的接口,而一个类没有实现接口的类,就显得十分麻烦,这时,我们就可以使用CGlib。
使用CGlib动态代理的要求
被代理的类必须不能是final类型,而是需要能够被继承的,CGlib实现代理的原理是自类增强父类
以下是示例:
目标类:
//目标类没有接口
public class AnotherService {
public void doFirst() {
System.out.println("this is first to do");
}
public void doSecond() {
System.out.println("this is first to do");
}
}
以下是代理类
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 CglibFacotry implements MethodInterceptor {
private AnotherService target;
public CglibFacotry(){
}
public CglibFacotry(AnotherService target) {
super();
this.target = target;
}
public AnotherService myCglibCreator(){
Enhancer enhancer=new Enhancer();
//这里就涉及到了Cglib增强的原理,是将目标类作为父类
//通过创建目标类的子类来对其进行增强
//这也是为什么被增强的目标类不能是final类
enhancer.setSuperclass(AnotherService.class);
//设置回调接口对象
//当前类实现了MethodInterceptor接口,而MethodInterceptor又继承了Callback接口
//回调传入对象的方法,这里也就是this.intercept()
enhancer.setCallback(this);
//用于创建Cglib动态代理对象
return (AnotherService) enhancer.create();
}
//回调接口的方法
//这里objects数组其实是目标方法参数列表
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("do some advice before invoke");
method.invoke(target,objects);
System.out.println("do some advice after invoke");
return null;
}
}