要了解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)代理類的能力。?