CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。
package cn.cglib.proxy;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
/**
* 使用CGLIB生成动态代理
* @author Administrator
*
*/
public class CgLibProxy implements MethodInterceptor{
private InfoDao infoDao;
public CgLibProxy(InfoDao infoDao) {
super();
this.infoDao = infoDao;
}
public InfoDao createProxy(){
/**
* 使用CGLIB生成代理:
* 1.创建核心类
* 2.为其设置父类
* 3.设置回调
* 4.创建代理
*/
//创建核心类
Enhancer enhancer=new Enhancer();
//为其设置父类
enhancer.setSuperclass(infoDao.getClass());
//设置回调:实现MethodInterceptor接口
enhancer.setCallback(this);
//创建代理
return (InfoDao) enhancer.create();
}
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
// TODO Auto-generated method stub
//进行代理设置
if("update".equals(method.getName())){
System.out.println("***********CGLIB的日志记录***********");
Object obj=methodProxy.invokeSuper(proxy, args);
return obj;
}
return methodProxy.invokeSuper(proxy, args);
}
}
测试类:
//cglib代理
@Test
public void test2(){
InfoDao infoDao=new InfoDao();
InfoDao proxy=new CgLibProxy(infoDao).createProxy();
proxy.add();
proxy.update();
}
总结:Spring框架,如果类实现了接口,就使用JDK的动态代理生成代理对象,如果这个类没有实现任何接口,使用CGLIB生成代理对象.