轉(zhuǎn)帖|行業(yè)資訊|編輯:郝浩|2016-02-26 14:05:31.000|閱讀 530 次
概述:代理的目的是調(diào)用目標(biāo)方法時我們可以轉(zhuǎn)而執(zhí)行InvocationHandler類的invoke方法,所以如何在InvocationHandler上做文章就是Spring實(shí)現(xiàn)Aop的關(guān)鍵所在。Spring的Aop實(shí)現(xiàn)是遵守Aop聯(lián)盟的約定。同時Spring又?jǐn)U展了它,增加了如Pointcut、Advisor等一些接口使得更加靈活。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
從前面代理的原理我們知道,代理的目的是調(diào)用目標(biāo)方法時我們可以轉(zhuǎn)而執(zhí)行InvocationHandler類的invoke方法,所以如何在InvocationHandler上做文章就是Spring實(shí)現(xiàn)Aop的關(guān)鍵所在。
Spring的Aop實(shí)現(xiàn)是遵守Aop聯(lián)盟的約定。同時Spring又?jǐn)U展了它,增加了如Pointcut、Advisor等一些接口使得更加靈活。
下面是Jdk動態(tài)代理的類圖:
上圖清楚的顯示了Spring引用了Aop Alliance定義的接口。姑且不討論Spring如何擴(kuò)展Aop Alliance,先看看Spring如何實(shí)現(xiàn)代理類的,要實(shí)現(xiàn)代理類在Spring的配置文件中通常是這樣定一個Bean的 ,如下:
<bean id="testBeanSingleton" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value> org.springframework.aop.framework.PrototypeTargetTests$TestBean </value> </property> <property name="target"><ref local="testBeanTarget"></ref> </property> <property name="singleton"><value>true</value></property> <property name="interceptorNames"> <list> <value>testInterceptor</value> <value>testInterceptor2</value> </list> </property> </bean>
配置上看到要設(shè)置被代理的接口,和接口的實(shí)現(xiàn)類也就是目標(biāo)類,以及攔截器也就在執(zhí)行目標(biāo)方法之前被調(diào)用,這里Spring中定義的各種各樣的攔截器,可以選擇使用。
下面看看Spring如何完成了代理以及是如何調(diào)用攔截器的。
前面提到Spring Aop也是實(shí)現(xiàn)其自身的擴(kuò)展點(diǎn)來完成這個特性的,從這個代理類可以看出它正是繼承了Factory Bean的ProxyFactoryBean,F(xiàn)actoryBean之所以特別就在它可以讓你自定義對象的創(chuàng)建 方法。當(dāng)然代理對象要通過Proxy類來動態(tài)生成。
下面是Spring創(chuàng)建的代理對象的時序圖:
Spring創(chuàng)建了代理對象后,當(dāng)你調(diào)用目標(biāo)對象上的方法時,將都會被代理到InvocationHandler類的invoke方法中執(zhí)行,這在前面已經(jīng)解釋。在這里JdkDynamicAopProxy類實(shí)現(xiàn)了InvocationHandler接口。
下面再看看Spring是如何調(diào)用攔截器的,下面是這個過程的時序圖:
以上所說的都是Jdk動態(tài)代理,Spring還支持一種CGLIB類代理,感興趣的可以自己查閱。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn