目录
Cglib代理是什么?
JDK代理,原理是实现同一个接口去实现代理的。
而Cglib的原理是,实现你提供的目标类作为父类,在内存中生成一个子类去继承目标类,实现的。
Cglib小案例
引入glib库
cglib是第三方的一个代码生成库,所以我们使用的时候需要先引入库。
1. jar包下载:
下载解压后可以看见这四个jar包
2. 添加依赖
先把四个jar包复制到需要使用的项目中
然后添加依赖
撸代码
假设你是卖面膜的,我是你的代理。我可以把面膜卖给我的朋友。
你——被代理者
package 代理模式.cglib代理;
// 你是被代理对象
public class You {
public void sellMask() {
System.out.println("卖面膜");
}
}
代理工厂(可以生成代理)
这个类并不是代理类,而是调用了Cglib的方法生成了一个代理类,并且把代理类返回给调用者。
package 代理模式.cglib代理;
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 ProxyFactory implements MethodInterceptor{
private Object target;
public ProxyFactory(Object target) {
this.target=target;
}
public Object getYouInstance() {
// 创建一个用于生成代理类的工具类
Enhancer enhancer = new Enhancer();
// 设置被代理类
enhancer.setSuperclass(target.getClass());
// 设置处理类
enhancer.setCallback(this);
// 返回创建的代理类
return enhancer.create();
}
// 处理代理方法调用
@Override
public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable {
System.out.println("我是代理,能把面膜卖给自己的盆友");
Object returnVal = method.invoke(target, args);
return returnVal;
}
}
我的朋友——客户端
package 代理模式.cglib代理;
// 相当于客户端
public class MyFriend {
public static void main(String[] args) {
// 被代理对象
You you = new You();
// 获取Cglib代理对象
You me = (You) new ProxyFactory(you).getYouInstance();
me.sellMask();
}
}
运行结果:
我是代理,能把面膜卖给自己的盆友
卖面膜
总结:
Cglib代理的使用步骤:
1. 导入jar包
2. 添加依赖
3. 调用Enhancer的方法生成代理