Spring?AOP中的動(dòng)態(tài)代理:JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理

靜態(tài)代理模式

?所謂靜態(tài)代理就是AOP框架會(huì)在編譯階段生成AOP代理類,因此也稱為編譯時(shí)增強(qiáng)。ApsectJ是靜態(tài)代理的實(shí)現(xiàn)之一,也是最為流行的。靜態(tài)代理由于在編譯時(shí)就生成了代理類,效率相比動(dòng)態(tài)代理要高一些。AspectJ可以單獨(dú)使用,也可以和Spring結(jié)合使用。

動(dòng)態(tài)代理模式

?與靜態(tài)代理不同,動(dòng)態(tài)代理就是說AOP框架不會(huì)去修改編譯時(shí)生成的字節(jié)碼,而是在運(yùn)行時(shí)在內(nèi)存中生成一個(gè)AOP代理對(duì)象,這個(gè)AOP對(duì)象包含了目標(biāo)對(duì)象的全部方法,并且在特定的切點(diǎn)做了增強(qiáng)處理,并回調(diào)原對(duì)象的方法。

?Spring AOP中的動(dòng)態(tài)代理主要有兩種方式:JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理。

?JDK代理通過反射來處理被代理的類,并且要求被代理類必須實(shí)現(xiàn)一個(gè)接口。核心類是 InvocationHandler接口 和 Proxy類。

?而當(dāng)目標(biāo)類沒有實(shí)現(xiàn)接口時(shí),Spring AOP框架會(huì)使用CGLIB來動(dòng)態(tài)代理目標(biāo)類。

?CGLIB(Code Generation Library),是一個(gè)代碼生成的類庫,可以在運(yùn)行時(shí)動(dòng)態(tài)的生成某個(gè)類的子類。CGLIB是通過繼承的方式做的動(dòng)態(tài)代理,因此如果某個(gè)類被標(biāo)記為final,那么它是無法使用CGLIB做動(dòng)態(tài)代理的。核心類是 MethodInterceptor 接口和Enhancer 類。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容