JDK動(dòng)態(tài)代理
Jdk1.3引入了動(dòng)態(tài)代理技術(shù),它要求要目標(biāo)類必須實(shí)現(xiàn)接口,簡(jiǎn)單說(shuō),jdk實(shí)現(xiàn)的動(dòng)態(tài)代理只能針對(duì)于實(shí)現(xiàn)接口的類的對(duì)象創(chuàng)建代理。
java.lang.reflect.Proxy類提供了創(chuàng)建對(duì)象代理對(duì)象的方法
代碼實(shí)現(xiàn)
創(chuàng)建目標(biāo)類
創(chuàng)建代理工廠類
測(cè)試操作
Cglib動(dòng)態(tài)代理
JDK的動(dòng)態(tài)代理用起來(lái)非常簡(jiǎn)單,但它有一個(gè)限制,就是使用動(dòng)態(tài)代理的對(duì)象必須實(shí)現(xiàn)一個(gè)或多個(gè)接口。如果想代理沒(méi)有實(shí)現(xiàn)接口的繼承的類,該怎么辦?現(xiàn)在我們可以使用CGLIB
CGLIB(Code Generation Library)是一個(gè)開(kāi)源項(xiàng)目!
是一個(gè)強(qiáng)大的,高性能,高質(zhì)量的Code生成類庫(kù),它可以在運(yùn)行期擴(kuò)展Java類與實(shí)現(xiàn)Java接口
如果我們獨(dú)立使用cglib,我們需要單獨(dú)導(dǎo)入cglib的jar包,而在spring的高版本中,已經(jīng)引入了cglib的包,所以不需要在單獨(dú)導(dǎo)入。(內(nèi)置在spring-core包中)
注意:如果單獨(dú)使用cglib,還需要引入一個(gè)asm包。原因:CGLIB包的底層是通過(guò)使用一個(gè)小而快的字節(jié)碼處理框架ASM,來(lái)轉(zhuǎn)換字節(jié)碼并生成新的類。
目標(biāo)類
使用cglib創(chuàng)建代理工廠
測(cè)試代碼
注意:在spring的底層AOP實(shí)現(xiàn),默認(rèn)提供jdk動(dòng)態(tài)代理與cglib動(dòng)態(tài)代理。
問(wèn)題:spring底層到底使用哪種代理?
- 如果目標(biāo)類實(shí)現(xiàn)了接口,優(yōu)先使用jdk動(dòng)態(tài)代理
- 如果目標(biāo)類無(wú)接口實(shí)現(xiàn),使用cglib動(dòng)態(tài)代理
本文版權(quán)歸傳智播客
Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!