轉帖|行業資訊|編輯:郝浩|2016-02-26 14:05:31.000|閱讀 530 次
概述:代理的目的是調用目標方法時我們可以轉而執行InvocationHandler類的invoke方法,所以如何在InvocationHandler上做文章就是Spring實現Aop的關鍵所在。Spring的Aop實現是遵守Aop聯盟的約定。同時Spring又擴展了它,增加了如Pointcut、Advisor等一些接口使得更加靈活。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
從前面代理的原理我們知道,代理的目的是調用目標方法時我們可以轉而執行InvocationHandler類的invoke方法,所以如何在InvocationHandler上做文章就是Spring實現Aop的關鍵所在。
Spring的Aop實現是遵守Aop聯盟的約定。同時Spring又擴展了它,增加了如Pointcut、Advisor等一些接口使得更加靈活。
下面是Jdk動態代理的類圖:
上圖清楚的顯示了Spring引用了Aop Alliance定義的接口。姑且不討論Spring如何擴展Aop Alliance,先看看Spring如何實現代理類的,要實現代理類在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>
配置上看到要設置被代理的接口,和接口的實現類也就是目標類,以及攔截器也就在執行目標方法之前被調用,這里Spring中定義的各種各樣的攔截器,可以選擇使用。
下面看看Spring如何完成了代理以及是如何調用攔截器的。
前面提到Spring Aop也是實現其自身的擴展點來完成這個特性的,從這個代理類可以看出它正是繼承了Factory Bean的ProxyFactoryBean,FactoryBean之所以特別就在它可以讓你自定義對象的創建 方法。當然代理對象要通過Proxy類來動態生成。
下面是Spring創建的代理對象的時序圖:
Spring創建了代理對象后,當你調用目標對象上的方法時,將都會被代理到InvocationHandler類的invoke方法中執行,這在前面已經解釋。在這里JdkDynamicAopProxy類實現了InvocationHandler接口。
下面再看看Spring是如何調用攔截器的,下面是這個過程的時序圖:
以上所說的都是Jdk動態代理,Spring還支持一種CGLIB類代理,感興趣的可以自己查閱。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn