[Spring.Net]Aop with Nested AroundAdvice
前言
上一篇文章『Aop introduction–以performance log為例』介紹了如何使用Spring.Net來達到Aop的功能,例子是AroundAdvice,用來作performance monitoring。這時候同事罩哥看著Sample code,提出了一個很有趣的問題:如果有兩個以上的AroundAdvice class (實作IMethodInterceptor),那invocation.Proceed()會不會跑兩次?這樣應該很有問題。直覺當然是應該沒問題,如果有問題,Spring也笨了點,不過我也很好奇,會怎麼跑。基於實驗的精神,我們就來測試看看Nested AroundAdvice的執行過程長怎樣囉。
實作
我們新增一支TestByJoey.cs,內容基本上與上一個例子的PerformanceLoggingAroundAdvice.cs一模一樣。接著在Spring設定檔的部分,我們把Spring.Aop.Framework.ProxyFactoryObject的interceptorNames,多injection TestByJoey這個object進去。
<!--該AOP用到哪一些Service,要加進去Property裡面,該Property是ref到哪一個Service object-->
<object id="JoeyServiceWithAOP" type="Spring.Aop.Framework.ProxyFactoryObject" >
<property name="target" ref="JoeyService" />
<property name="interceptorNames">
<list>
<value>testByJoey</value>
<value>performanceLoggingAroundAdvice</value>
</list>
</property>
</object>
要注意一下,我們是把testByJoey放在前面,後面才放performanceLoggingAroundAdvice。
接著我們來看偵錯的情況:
1. 會先執行TestByJoey,當執行到invocation.Proceed(),會檢查是否還有其他的around advice,若有,則進入該around advice class。
2.當進入TestByJoey的invocation.Proceed()後,會進入PerformanceLogging這一支Interceptor,直到沒有其他的around advice,才會實際執行RealSubject的method。
3.執行完RealSubject的method後,因為是nested的around advice,所以會是先進後出的方式離開stack。
4.實際輸出結果,PerformanceLogging 先記log,因為後進先出。
結論
Spring.Net的Aop還是很聰明的,不過相對的,在設計Nested的Around advice,是該考量到順序會不會造成其他side effect。
blog 與課程更新內容,請前往新站位置:http://tdd.best/