教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

Java培訓(xùn)實(shí)戰(zhàn)教程之spring的AOP底層實(shí)現(xiàn)介紹

更新時(shí)間:2015年12月29日13時(shí)31分 來(lái)源:傳智播客Java培訓(xùn)學(xué)院 瀏覽次數(shù):

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è)接口。如果想代理沒有實(shí)現(xiàn)接口的繼承的類,該怎么辦?現(xiàn)在我們可以使用CGLIB
CGLIB(Code Generation Library)是一個(gè)開源項(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包的底層是通過使用一個(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)代理。
問題:spring底層到底使用哪種代理?
  1. 如果目標(biāo)類實(shí)現(xiàn)了接口,優(yōu)先使用jdk動(dòng)態(tài)代理
  2. 如果目標(biāo)類無(wú)接口實(shí)現(xiàn),使用cglib動(dòng)態(tài)代理
  本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/javaee

0 分享到:
和我們?cè)诰€交談!