动态代理之CGLib

阅读更多

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();

}

}

 

你可能感兴趣的:(spring,框架,cglib,动态代理)