目錄
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的方法生成代理