[Spring.Net]Aop with Nested AroundAdvice

[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。

image

 

 

image

 

2.當進入TestByJoey的invocation.Proceed()後,會進入PerformanceLogging這一支Interceptor,直到沒有其他的around advice,才會實際執行RealSubject的method。

image

 

3.執行完RealSubject的method後,因為是nested的around advice,所以會是先進後出的方式離開stack。

image

 

image

 

4.實際輸出結果,PerformanceLogging 先記log,因為後進先出。

image

 

結論
Spring.Net的Aop還是很聰明的,不過相對的,在設計Nested的Around advice,是該考量到順序會不會造成其他side effect。

 

 

 

 


blog 與課程更新內容,請前往新站位置:http://tdd.best/