Spring中AOP的特性解析

要了解Spring的AOP就必須要了解動(dòng)態(tài)代理的原理,因?yàn)锳OP就是基于動(dòng)態(tài)代理實(shí)現(xiàn)的。

? ? java.lang.reflect包下有個(gè)Proxy類,它正是構(gòu)造代理類的入口,其中newProxyInstance就是創(chuàng)建代理對(duì)象的方法,這個(gè)方法需要三個(gè)參數(shù):

????????1.ClassLoader(用于加載代理類的loader);

????????2.Interfaces,是要被代理的那些接口;

????????3.InvocationHandler,用于執(zhí)行除了被代理接口中方法之外的用戶自定義操作(也是我們需要代理類的真正目的)。用戶調(diào)用目標(biāo)方法都被代理到InvocationHandler類中定義的唯一方法Invoke()中。

代理的目的就是調(diào)用目標(biāo)方法時(shí)可以轉(zhuǎn)而執(zhí)行InvocationHandler類的invoke方法,所以在InvocationHandler上做文章就是Spring實(shí)現(xiàn)AOP的關(guān)鍵之處。這就是JAVA中JDK代理。

這里其實(shí)運(yùn)用到了一個(gè)設(shè)計(jì)模式:代理模式

設(shè)計(jì)模式主要分:動(dòng)態(tài)代理和靜態(tài)代理

靜態(tài)代理:可以理解為對(duì)象由代理創(chuàng)建,在創(chuàng)建前后做一些事情,比如統(tǒng)計(jì)創(chuàng)建了多少對(duì)象,但靜態(tài)代理只能創(chuàng)建一個(gè)或固定的幾個(gè)對(duì)象。像如果是Spring中Bean,靜態(tài)代理就明顯不合適,因?yàn)檫@樣不僅需要程序員手動(dòng)創(chuàng)建大量的代理接口,而且也不能保證可擴(kuò)展性。

為什么AOP選擇使用動(dòng)態(tài)代理實(shí)現(xiàn):

????????動(dòng)態(tài)代理類的字節(jié)碼在程序運(yùn)行時(shí)由Java反射機(jī)制動(dòng)態(tài)生成,無(wú)需程序員手工編寫(xiě)它的源代碼。動(dòng)態(tài)代理類不僅簡(jiǎn)化了編程工作,而且提高了軟件系統(tǒng)的可擴(kuò)展性,因?yàn)镴ava 反射機(jī)制可以生成任意類型的動(dòng)態(tài)代理類。java.lang.reflect 包中的Proxy類和InvocationHandler 接口提供了生成動(dòng)態(tài)代理類的能力。?

最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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