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

全國咨詢/投訴熱線:400-618-4000

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

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

JDK動態(tài)代理

Jdk1.3引入了動態(tài)代理技術(shù),它要求要目標(biāo)類必須實(shí)現(xiàn)接口,簡單說,jdk實(shí)現(xiàn)的動態(tài)代理只能針對于實(shí)現(xiàn)接口的類的對象創(chuàng)建代理。
java.lang.reflect.Proxy類提供了創(chuàng)建對象代理對象的方法
代碼實(shí)現(xiàn)
創(chuàng)建目標(biāo)類
創(chuàng)建代理工廠類
測試操作

Cglib動態(tài)代理

JDK的動態(tài)代理用起來非常簡單,但它有一個限制,就是使用動態(tài)代理的對象必須實(shí)現(xiàn)一個或多個接口。如果想代理沒有實(shí)現(xiàn)接口的繼承的類,該怎么辦?現(xiàn)在我們可以使用CGLIB
CGLIB(Code Generation Library)是一個開源項(xiàng)目!
是一個強(qiáng)大的,高性能,高質(zhì)量的Code生成類庫,它可以在運(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,還需要引入一個asm包。原因:CGLIB包的底層是通過使用一個小而快的字節(jié)碼處理框架ASM,來轉(zhuǎn)換字節(jié)碼并生成新的類。
目標(biāo)類
使用cglib創(chuàng)建代理工廠
測試代碼
注意:在spring的底層AOP實(shí)現(xiàn),默認(rèn)提供jdk動態(tài)代理與cglib動態(tài)代理。
問題:spring底層到底使用哪種代理?
  1. 如果目標(biāo)類實(shí)現(xiàn)了接口,優(yōu)先使用jdk動態(tài)代理
  2. 如果目標(biāo)類無接口實(shí)現(xiàn),使用cglib動態(tài)代理
  本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://oisangadgets.com/javaee

0 分享到:
和我們在線交談!