CGLIB(Code Generation Library)是一个开源项目。
JDK是针对接口的,有局限性,必须由接口。对于,
业务类不使用接口的,无法使用jdk的动态代理。
CGLib是一个开源的类库,采用非常底层的字节码技术,
可以为一个类创建子类,解决无接口代理问题。
jdk 和 CGLib 生成代理的区别?
jdk动态代理--目标对象面向接口的代理
CGLib代理--目标对象类的子类
Spring在最新的3.2版本,已经内部集成了CGLib开发包。
在spring-core中。
也就是说:spring3.2之前,使用cglib需要我们手动导入jar--cglib.2.2.3.zip
spring3.2之后,我们使用cglib,只需要导入spring的核心jar包,就可以使用。
*CGLib生成代理的步骤:
package junit;
import java.lang.reflect.Method;
import org.junit.Test;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import cn.gp.proxy.proxypattern.ProductDao;
public class CGLibProxyTest {
@Test
public void testCGLib(){
final ProductDao productDao = new ProductDao();
//第一步,创建Enhancer对象
Enhancer enhancer = new Enhancer();
//第二步,设置根据哪个类生成子类。
enhancer.setSuperclass(productDao.getClass());
//第三步,绑定回调函数callback()--代理类在实现方法时,调用callback
enhancer.setCallback(new MethodInterceptor() {
/**
* proxy:生成的代理对象本身
* method:要执行的方法(反射对象)
* args:要执行的方法的参数
* methodProxy:代理对象的方法,不使用
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
System.out.println("被代理对象的任何方法被调用,都会在此被拦截。。。。");
//调用 被代理对象 的方法(放行)
return method.invoke(productDao, args);
}
});
//第四步,创建代理对象
ProductDao productDaoProxy = (ProductDao) enhancer.create();
productDaoProxy.addProduct();
}
}