spring之代理

### 什么是代理?

簡單點講,代理就是幫[目標(biāo)對象]去完成它應(yīng)該做,但是不想或者不擅長做的事情。

例子:

媒婆:幫你找對象。

黃牛:幫你去掛號。

社保代辦:幫你繳納社保。

* 對于動態(tài)代理的學(xué)習(xí)目標(biāo)

* 了解代理對象是如何產(chǎn)生的?牽扯到Classloader的理解

* 會編寫JDK和cglib的動態(tài)代理代碼

* 了解代理對象和InvocationHandler實現(xiàn)類直接的關(guān)系(調(diào)用關(guān)系)

* 代理模式分為靜態(tài)代理和動態(tài)代理

* 靜態(tài)代理:就是編寫一個代理類,去代理[目標(biāo)對象]

* 動態(tài)代理:在運行期間,通過反射,對[目標(biāo)對象]產(chǎn)生一個[代理對象]

* 動態(tài)代理的實現(xiàn)方式分為兩種,下面兩種方式生成的代理類都是繼承了Proxy:

* JDK實現(xiàn)的? ? ? :基于接口的,也就是說[目標(biāo)對象]必須實現(xiàn)一個接口,[目標(biāo)對象]和[代理對象]都實現(xiàn)該接口

* 目錄類必須實現(xiàn)接口

```

* 編寫代理工廠類 implements InvocationHandler{

getProxy(target){return Proxy.newInstance(Classloader,interface,this)}

invoke(proxy,method,args)方法

}

* 生成的代理對象

public final void saveUser()

throws

{

try

{

this.h.invoke(this, m3, null); // h 就是上面的代理工廠類

return;

}

catch (Error|RuntimeException localError)

{

throw localError;

}

catch (Throwable localThrowable)

{

throw new UndeclaredThrowableException(localThrowable);

}

}

```

* cglib實現(xiàn)的 :可以被繼承的普通類,它是通過繼承的方式,產(chǎn)生一個子類,這個子類就是代理類

* 為什么使用動態(tài)代理呢?

增強對象的功能。這種增強,是符合開閉原則的,不會對目標(biāo)對象進行修改,只需要擴展就可以實現(xiàn)增強

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容