更新時間:2018-06-29 來源:黑馬程序員JavaEE培訓學院 瀏覽量:
概念
靜態(tài)代理
動態(tài)代理
cglib代理
概念
代理模式:代理模式,顧名思義,肯定跟代理有很大的聯(lián)系,代理的意思即是通過訪問其他目標進行操作來代替直接操作目標對象,也就是通過代理對象來訪問目標對象。
好處:這樣做的好處是可以再目標對象的基礎(chǔ)上,增強額外的功能操作,即擴展目標對象的功能。
使用代理模式的原因:
中介隔離作用:在某些情況下,一個客戶類不想或者不能直接引用一個委托對象,而代理類對象可以在客戶類和委托對象之間起到中介的作用,其特征是代理類和委托類實現(xiàn)相同的接口。
開閉原則,增加功能:代理類除了是客戶類和委托類的中介之外,我們還可以通過給代理類增加額外的功能來擴展委托類的功能,這樣做我們只需要修改代理類而不需要再修改委托類,符合代碼設(shè)計的開閉原則。代理類主要負責為委托類預(yù)處理消息、過濾消息、把消息轉(zhuǎn)發(fā)給委托類,以及事后對返回結(jié)果的處理等。代理類本身并不真正實現(xiàn)服務(wù),而是同過調(diào)用委托類的相關(guān)方法,來提供特定的服務(wù)。真正的業(yè)務(wù)功能還是由委托類來實現(xiàn),但是可以在業(yè)務(wù)功能執(zhí)行的前后加入一些公共的服務(wù)。例如我們想給項目加入緩存、日志這些功能,我們就可以使用代理類來完成,而沒必要打開已經(jīng)封裝好的委托類。
靜態(tài)代理
靜態(tài)代理需要與目標對象繼承相同的接口
靜態(tài)代理總結(jié):
1.可以做到在不修改目標對象的功能前提下,對目標功能擴展。
2.缺點:因為代理對象需要與目標對象實現(xiàn)一樣的接口,所以會有很多代理類,類太多.同時,一旦接口增加方法,目標對象與代理對象都要維護.
動態(tài)代理
動態(tài)代理主要是通過反射機制來獲取目標對象的接口方法。
動態(tài)代理有以下特點:
1.代理對象,不需要實現(xiàn)接口 。
2.代理對象的生成,是利用JDK的API,動態(tài)的在內(nèi)存中構(gòu)建代理對象(需要我們指定創(chuàng)代理對象/目標對象實現(xiàn)的接口的類型) 3.動態(tài)代理也叫做:JDK代理,接口代理。
cglib代理
上面的靜態(tài)代理和動態(tài)代理模式都是要求目標對象是實現(xiàn)一個接口的目標對象,但是有時候目標對象只是一個單獨的對象,并沒有實現(xiàn)任何的接口,這個時候就可以使用以目標對象子類的方式類實現(xiàn)代理,這種方法就叫做:Cglib代理
Cglib代理,也叫作子類代理,它是在內(nèi)存中構(gòu)建一個子類對象從而實現(xiàn)對目標對象功能的擴展。
JDK的動態(tài)代理有一個限制,就是使用動態(tài)代理的對象必須實現(xiàn)一個或多個接口,如果想代理沒有實現(xiàn)接口的類,就可以使用Cglib實現(xiàn)。
Cglib是一個強大的高性能的代碼生成包,它可以在運行期擴展java類與實現(xiàn)java接口.它廣泛的被許多AOP的框架使用,例如Spring AOP和synaop,為他們提供方法的interception(攔截)
Cglib包的底層是通過使用一個小而塊的字節(jié)碼處理框架ASM來轉(zhuǎn)換字節(jié)碼并生成新的類.不鼓勵直接使用ASM,因為它要求你必須對JVM內(nèi)部結(jié)構(gòu)包括class文件的格式和指令集都很熟悉。
Cglib子類代理實現(xiàn)方法:
1.需要引入cglib的jar文件,但是Spring的核心包中已經(jīng)包括了Cglib功能,所以直接引入pring-core-3.2.5.jar即可
2.引入功能包后,就可以在內(nèi)存中動態(tài)構(gòu)建子類
3.代理的類不能為final,否則報錯
4.目標對象的方法如果為final/static,那么就不會被攔截,即不會執(zhí)行目標對象額外的業(yè)務(wù)方法
本文版權(quán)歸黑馬程序員JavaEE學院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
首發(fā):http://java.itheima.com/