CGLib动态代理

     Spring中的动态代理有JDK自身的动态代理和CGLIB动态代理两种,JDK代理有个限制,只能为接口创建实例,对于没有接口定义业务方法的类,JDK代理就不行使用了,这个时候就可以使用CGLib。
     首先要了解下什么是CGLib,可以问谷歌百度,我这里摘抄一部分:CGLIB(Code Generation Library)是一个开源项目! 是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO字节码的动态生成。等等等等,只需要知道CGLIB采用底层的字节码技术,可以为一个类创建子类,并在子类中拦截父类方法的调用,并织入切面,当然你要使用CGLib就要导入对应的jar包。另外还要导入一个asm.jar包,这是spring aop的一 个依赖包,通过这个库来操作java字节码的。

     好了,下面就来进行CGLib的代理。

1.既然是子类拦截父类的方法调用,就要新建一个父类。还用那个睡觉的例子。 
package cglibProxy; 
public class Sleep { 
    public void sleep(){ 
    System.out.println("time to sleep!"); 
    } 
}

2.实现MethodInterceptor,实现拦截父类方法,并调用父类方法。

package cglibProxy;


import java.lang.reflect.Method;


import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;


public class CglibProxy implements MethodInterceptor{
   private Enhancer enHan=new Enhancer();
   
   public Object getProxy(Class classC){
   //设置要创建子类的类
   enHan.setSuperclass(classC);
   enHan.setCallback(this);
   //创建子类
   return enHan.create();
   }
   //拦截父类方法的调用
   @Override
   public Object intercept(Object obj, Method method, Object[] arg2,
     MethodProxy proxy) throws Throwable {
     // TODO Auto-generated method stub
     System.out.println("Before sleep:Take off clothes!");
     //通过代理器调用父类的方法
     Object objReturn=proxy.invokeSuper(obj, arg2);
     System.out.println("After sleep:Have a good dream!");
     return objReturn;
}
}

3.就是编写测试类了。 

package cglibProxy; 
public class CglibProxyTest { 
   public static void main(String [] args){ 
  CglibProxy cgProxy=new CglibProxy(); 
  Sleep sleep=(Sleep)cgProxy.getProxy(Sleep.class); 
  sleep.sleep(); 
   }
}
运行结果就是我们想要的:
Before sleep:Take off clothes!
time to sleep!
After sleep:Have a good dream!






你可能感兴趣的:(CGLib动态代理)