更新時(shí)間:2022-11-17 10:43:49 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽612次
靜態(tài)代理通常是對(duì)原有業(yè)務(wù)邏輯的擴(kuò)展。
代理的三要素
通用接口
public interface Action {
public void doSomething();
}
實(shí)物
public class RealObject implements Action{
public void doSomething() {
System.out.println("do something");
}
}
代理對(duì)象
public class Proxy implements Action {
private Action realObject;
public Proxy(Action realObject) {
this.realObject = realObject;
}
public void doSomething() {
System.out.println("proxy do");
realObject.doSomething();
}
}
通過(guò)使用動(dòng)態(tài)Proxy,我們可以在運(yùn)行時(shí)動(dòng)態(tài)生成一個(gè)持有RealObject并實(shí)現(xiàn)Proxy接口的Proxy,并注入相同的擴(kuò)展邏輯。
使用動(dòng)態(tài)代理
public class DynamicProxyHandler implements InvocationHandler {
private Object realObject;
public DynamicProxyHandler(Object realObject) {
this.realObject = realObject;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//Agent extension logic
System.out.println("proxy do");
return method.invoke(realObject, args);
}
}
invoke 方法實(shí)現(xiàn)了要擴(kuò)展的公共函數(shù)
public static void main(String[] args) {
RealObject realObject = new RealObject();
Action proxy = (Action) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Action.class}, new DynamicProxyHandler(realObject));
proxy.doSomething();
}
它們之間的區(qū)別
靜態(tài)代理只能用于相應(yīng)的類。如果有很多類,則需要很多代理。動(dòng)態(tài)代理就是為了彌補(bǔ)靜態(tài)代理的這一缺陷。通過(guò)使用動(dòng)態(tài)Proxy,我們可以在運(yùn)行時(shí)動(dòng)態(tài)生成一個(gè)持有RealObject并實(shí)現(xiàn)Proxy接口的Proxy,并注入相同的擴(kuò)展邏輯。即使你要Proxy的RealObject是不同的對(duì)象,甚至是不同的方法,你也可以使用動(dòng)態(tài)Proxy來(lái)擴(kuò)展功能。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743