什麼是代理,為什麼要用動態代理?

語言: CN / TW / HK

一說到代理,大家可能都會聯想到JDK Proxy、Cglib、AOP等等,這些都算是動態代理。另外,我花了1個多星期把往期的面試題解析配套文件準備好了,想獲取的小夥伴可以在我的煮葉簡介中找到。

為什麼我們需要動態代理呢?在解答這個問題之前,先跟大家聊清楚什麼是靜態代理。

1、從靜態代理到動態代理

靜態代理呢是代理模式的一種實現形態。代理模式的官方原文是這樣的:

大致意思是,為其他物件提供一種代理項或佔位符,以控制對這個物件的訪問。什麼意思呢?代理模式最核心的思想是建立一個代理物件作為在客戶端和目標物件之間中介。主要目的是保護目標物件和增強目標物件。

那什麼是靜態代理?就相當於是這個代理物件需要手動來建立,而且一個代理物件只能服務於一種型別的物件,那麼,當有n個業務的目標物件時,就需要n個靜態代理,這樣就不利於業務的擴充套件。

舉一個例子,有個程式設計師張三,平時加班比較多,加上公司的異性同事又少,也不太善於和身邊的人溝通,自己又缺 少人脈和資源,所以一直沒有找物件。這個時候張三的父親張老三就著急了,利用自己的人脈,經常給張三安排相親。那張老三就是張三的代理相親物件。

那麼,問題來了。一般情況下,張老三是不會給李四去安排相親的,因為張老三是不會關心李四有沒有物件這個事情的,只有李老四才會關心李四有沒有物件。這個時候,就出現一個新的職業 -- 媒婆。媒婆會關心張三、李四、王五、趙六是否有物件,媒婆就成了所有有相親需求的代理物件,這種一個代理物件就可以服務於所有相關的業務物件,就相當於動態代理物件。

   

那為什麼需要動態代理呢?我總結為以下兩個原因:

1、可以減少代理物件的個數,降低程式複雜度。

2、易於複雜業務的動態擴充套件。

2、動態代理實現原理

那在Java中動態代理的實現原理是怎樣的呢?以JDK Proxy為例,我歸納為以下5個步驟:

第1步:拿到目標物件的引用,並且通過反射獲取目標物件的所有介面

第2步:重新生成一個新的代理類,實現目標類所有的介面方法;

第3步:把增強的邏輯程式碼加入到新生成的代理類原始碼中。

第4步:動態編譯代理類的原始碼並生成.位元組碼,也就是class檔案。

第5步:載入並執行新生成的代理物件。

目前,主流動態代理API有兩種,分別是JDK Proxy和CGLib,CGLib的實現原理我就不詳細贅述了,如果想詳細瞭解的小夥伴可以在評論區回覆666,我可以單獨再拍一期影片詳細介紹。好了,最後,還是給大家介紹一下CBLib和JDK Proxy的區別。

3、JDK Proxy和CGLib對比

關於JDK Proxy和CBLib的區別我歸納為以下3點:

第1點:JDK Proxy是實現目標物件的介面,而GGLib是繼承目標物件

第2點:JDK Proxy和CGLib都是在執行期生成位元組碼。

第3點:JJDK Proxy是通過反射呼叫目標物件的方法,而CGLib是採用FastClass機制來呼叫

好了,以上就是我對動態代理的理解,你會了嗎?

我是被程式設計耽誤的文藝Tom,

本文為“Tom彈架構”原創,轉載請註明出處。技術在於分享,我分享我快樂!\ 如果本文對您有幫助,歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支援是我堅持創作的動力。 關注微信公眾號『 Tom彈架構 』回覆“666”可獲取200頁的PDF面試文件!

我是被程式設計耽誤的文藝Tom