动态代理——CGlib动态代理

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;
    }
}

猜你喜欢

转载自blog.csdn.net/ascend2015/article/details/79058779