CGLIB动态代理

/**
 * 普通类  未实现接口的类  如果实现了接口的类默认使用JDK动态代理
 * @author zzcy
 *
 */
public class Cat {

    public void add(){
        System.out.println("我养了一只猫。");
    }
}


/**
 * CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
 * 因为是继承,所以该类或方法最好不要声明成final 
 * @author zzcy
 *
 */
public class CGLibProxy implements MethodInterceptor{

    //需要代理的真实对象
    private Object targetObject;

    //创建代理对象
    public Object createProxyObject(Object obj) {    
        this.targetObject = obj;    
        //创建加强器,用来创建动态代理类  
        Enhancer enhancer = new Enhancer();  
        //为加强器指定要代理的业务类(即:为下面生成的代理类指定父类)
        enhancer.setSuperclass(this.targetObject.getClass());    
        //设置回调:对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要
        //实现intercept()方法进行拦截
        enhancer.setCallback(this);    
        // 创建动态代理类对象并返回
        Object proxyObj = enhancer.create();    
        return proxyObj;
    } 

    public void beforeM(){
        System.out.println("预处理···");
    }

    public void afterM(){
        System.out.println("处理后···");
    }

    //回调方法
    @Override
    public Object intercept(Object object, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable {
        beforeM();
        //调用业务类(父类中)的方法
        Object result = methodProxy.invokeSuper(object, arg);
        //System.out.println(method.getName());
        //System.out.println(methodProxy.getSuperName());
        afterM();
        return result;
    }

    public static void main(String[] args) {
        Cat cat = new Cat();
        CGLibProxy cgLibProxy = new CGLibProxy();
        Cat catProxy = (Cat) cgLibProxy.createProxyObject(cat);
        catProxy.add();
    }

    /*JDK动态代理和CGLIB字节码生成的区别
    (1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类
        JDK动态代理所用到的代理类在程序调用到代理类对象时才由JVM真正创建,JVM根据传进来的
        业务实现类对象以及方法名 ,动态地创建了一个代理类的class文件并被字节码引擎执行,
        然后通过该代理类对象进行方法调用。
    (2)CGLIB是针对类实现代理,主要是对指定的业务类生成一个子类,并覆盖其中业务方法实现代理
        因为采用的是继承,所以不能对final修饰的类进行代理*/

    //  这里需要注意的是实现MethodIntercetor接口,必须导入cglib-nodep-x.x_x.jar这个包。
    //  CGLib是针对类来实现代理的,他的原理是对指定的目标生成一个子类,并覆盖其中方法实现增强,
    //  但因为采用的是继承,所以不能对final修饰的类进行代理。

    //如何强制使用CGLIB实现AOP?
    //(1)添加CGLIB库,SPRING_HOME/cglib/*.jar
    //(2)在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>
}

JDK动态代理文章请点击:
http://blog.csdn.net/renli2549/article/details/78490508

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值