<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功能
添加回答
舉報
0/150
提交
取消