亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

spring aop中的前置通知

spring aop中的前置通知

元芳怎么了 2018-09-23 20:06:38
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">    <property name="beanNames">         <list>             <value>fixassetService</value><!-- 添加需要攔截的service bean-->         </list>     </property>     <property name="interceptorNames">         <list>             <value>myInterceptor</value>             <value>myInterceptor2</value>         </list>           </property></bean>在上面的配置文件中 我配置了兩個interceptor ,這兩個interceptor的invoke方法中的邏輯是一樣的。public Object invoke(MethodInvocation invo) throws Throwable {//自己的橫切邏輯 log....invo.proceed()}我想請教的問題是,在 第一個interceptor的invoke執行的時候 會執行內部的invo.proceed()方法,這個方法本質就是我們joinpoint所表示的方法(或者說被插入橫切邏輯的方法),而當interceptor2執行invoke方法的 時候又會 執行interceptor2 的invoke方法,同時也就再次執行invo.proceed() 這樣 不就導致 joinpoint所表示的方法執行了兩次?請問 我的理解對嗎
查看完整描述

1 回答

?
九州編程

TA貢獻1785條經驗 獲得超4個贊

并不是這樣的,實際上兩個代理通知之間的執行關系不是順序關系,而是嵌套關系。
你的理解是生成代理類執行的關系是:

// 先執行myInterceptor的invoke方法myInterceptor.before();
myInterceptor.proceed();
myInterceptor.after();// 再執行myInterceptor2的invoke方法myInterceptor2.before();
myInterceptor2.invoke();
myInterceptor2.after();

這樣邏輯顯然是不對的
實際上執行順序應該為:

myInterceptor.before();
myInterceptor2.before();
method.proceed(); // 執行目標方法myInterceptor2.after();
myInterceptor.after();

這是一種嵌套關系。用通俗的說法理解可以為,你先用myInterceptor代理了你目標類,生成了代理類A,再用myInterceptor2代理了代理類A,生成了代理類B。
這時候B的invoke方法就是:

myInterceptor2.before();
A.invoke();
myInterceptor2.after();

B中調用了A的invoke方法,而A的invoke方法就是:

myInterceptor.before();
method.proceed(); // 執行目標方法myInterceptor.after();

這才是實際上AOP執行的順序,就不存在你理解的執行兩次目標方法的問題。

之前我正好有寫到模擬實現spring的AOP的功能,你感興趣可以看看:
實現AOP
引入aspectj實現AOP切點
加強AOP功能


查看完整回答
反對 回復 2018-09-23
  • 1 回答
  • 0 關注
  • 963 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號