開發者學堂課程【Java 進階程式設計:CGLIB 實作代理設計模式】學習筆記,與課程緊密聯系,讓使用者快速學習知識。
課程位址:
https://developer.aliyun.com/learning/course/20/detail/395CGLIB 實作代理設計模式
内容簡介:
一. Proxy 類建立代理對象
二.CGLIB 實作代理設計模式
從 Java 的官方來講已經明确的要求了如果要想實作代理設計模式,那麼一定是基于接口的應用,是以在官方給出的 Proxy 類建立代理對象時都需要傳遞該對象所有的接口資訊:
Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
但是這個時候有一部分的開發者就認為不應該強迫性的基于接口來實作代理設計。
比如資料庫,官方給出的标準做法是 SQL 語 句,有人認為 SQL 語句不好就不用SQL;如果操作程式開發,現在核心的結構是面向對象,有人認為面向對象不好,因為函數是程式設計。是以一些開發者就開發出了一個 CGLIB 的開發包,利用這個開發包就可以實作基于類的代理設計模式。
1)CGLIB 是一個第三方的程式包,需要單獨在 Eclipse 之中進行配置,現在假設程式包的路徑為:
D:\jar-lib\cglib-nodep-3.2.6.jar,那麼需要打開 Eclipse 項目屬性安裝第三方開發包;
比如找到程式,找到 properties,再跟上 Java Build Path,選擇 Libraries 下的Classpath,選擇 Add External JARs 增加一個擴充包,如下圖:

然後找到計算機我的電腦的 D 盤,再跟上一個開發包,現在就表示已經可以将第三方的程式包直接拿過來使用了;
這個操作以後會經常見到,因為以後會大量的使用第三方開發包。
2)編寫程式類,該類不實作任何接口;
比如現在要做是沒有接口的代理設計,是以在這裡面找到 message 類, message類在這裡就是一個普通的類。Message 沒有接口,如果沒有接口,操作形式是不可能變為代理設計的,但是 CGLIB 就不要求用接口來實作;
3)利用 CGLIB 編代理類,但是這個代理類需要做一個明确,此時相當于使用了類的形式實作了代理設計的處理,是以該代理設計需要通過 CGLIB 來生成代理對象;
定義一個代理類:
從整體來講,這個代理的結構跟之前做的操作形式非常相似,唯一的差別是這個代碼中沒有 proxy。
4)此時如果要想建立代理類對象,則就必須進行一系列的 CGLIB 處理;
不管怎麼操作代理操作,它一定要有一個公共的複位,實際上它是通過類的繼承來模拟代理過程的,程式代碼如下:
執行結果如下:
【消息代理】 進行消息發送通道的連結。
【發送消息】www.mldn.cn
【消息代理】關閉消息通道。
在進行代理設計模式定義的時候除了可以使用接口之外,也可以不受接口的限制而實作基于類的代理設計,但是如果從正常的設計角度來講,強烈建議還是基于接口的設計會比較合理。
CGLIB 隻是傳統代理設計上的一種功能的補充。
我們要清楚代理設計模式的基本結構,掌握動态代理,知道 CGLIB 不再強制性與接口綁定進而實作基于類的代理設計模式。