CGLIB(CodeGenerationLibrary)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。
如果被代理目标对象,没有实现任何接口,不能用JDK动态代理使,就要选用Cglib 类库进行动态代理。
Cglib 使用原理流程 和 JDK代理 是类似的
其底层依赖一个工具类org.springframework.cglib.proxy.Enhancer和一个接口org.springframework.cglib.proxy.MethodInterceptor
通过对目标对象类创建子类,覆盖方法,实现代理增强
代码示例:
CglibProxyUtils.java
package com.my.cglibproxy;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
//cglib 创建代理 工具类
public class CglibProxyUtils implements MethodInterceptor{
// 目标对象
private Object target;
public CglibProxyUtils(Object target) {
this.target = target;
}
// 创建代理
public Object createProxy(){
// 创建代理 工具类
Enhancer enhancer = new Enhancer();
// 设置父类型Class
enhancer.setSuperclass(target.getClass());
// 设置回调invocation对象
enhancer.setCallback(this);
// 创建代理
return enhancer.create();
}
/*
* proxy 是代理对象
* method 是调用方法反射对象
* args 是调用方法参数
* methodProxy 是调用目标方法代理对象 ,用于调用父类的方法
*
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
System.out.println("cglib 动态代理...");
// return method.invoke(target, args);
return methodProxy.invokeSuper(proxy, args);// 推荐写法
}
}
ProductDAO.java
package com.my.cglibproxy;
//目标对象
public class ProductDAO {
public void save(){
System.out.println("添加商品...");
}
public void search(){
System.out.println("搜索商品...");
}
}
Test.java
package com.my.cglibproxy;
public class Test {
// 没有代理
@org.junit.Test
public void demo1(){
System.out.println("没有代理");
ProductDAO productDAO = new ProductDAO();
productDAO.save();
productDAO.search();
System.out.println("-----------");
System.out.println();
}
// 使用cglib代理
@org.junit.Test
public void demo2(){
// 目标
System.out.println("使用cglib代理");
ProductDAO productDAO = new ProductDAO();
// 创建代理
CglibProxyUtils cglibProxyUtils = new CglibProxyUtils(productDAO);
ProductDAO proxy = (ProductDAO) cglibProxyUtils.createProxy();
// 执行方法
proxy.save();
proxy.search();
}
}
运行结果:
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/12097.html