[Spring.Net]AutoProxy設定,讓Aop更加彈性

[Spring.Net]AutoProxy設定,讓Aop更加彈性

前言
前面幾篇例子,有說明到怎麼在Spring的設定檔,加載Aop到我們的target class上,但當我們的object很多時,難道每一個object都要這樣子多增加一個Spring.Aop.Framework.ProxyFactoryObject來加載Aop模組嗎?那當我想要把整個系統的某一個Aop,甚至全部的Aop模組功能都取消時,設定檔不就幾乎要重寫了?(別忘了,Aop會作Dynamic Proxy,這中間的轉換是需要額外效能的)

這是很實際的需求,例如我們希望在測試階段,用Aop加載的performance monitor module,針對每一個object的Around advice都要記錄時間。當上線階段,我們希望performance monitor module全部移除。該怎麼作,才能讓我們設定Aop的部分享有彈性,且方便修改呢?

Spring.Net裡面有提供了AutoProxy的物件:Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator
接下來我們來看怎麼作。

實作

  1. 當我們是使用手動設定每一個object的Aop時,如下圖所示:
    手動Aop設定
     
  2. 而當我們使用AutoProxy後,可以將中間的Spring.Aop.Framework.ProxyFactoryObject設定省略,而由Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator來針對全域的object進行Aop的加載,如下圖所示:
    自動Aop設定
     

而AutoProxy的設定,該怎麼設定呢?請參考下圖:

autoProxy設定檔

 

 

只要將type設定成Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator,而ObjectNames這個property,指的是當spring設定檔中的object id,符合*Service這個命名時,就會加載的Interceptors Aop模組,以這邊的例子就是加載beforeAdviceForUnitTestCase以及performanceLoggingAroundAdvice。

類似這樣的AutoProxyCreator,可以設定很多組,針對不同的ObjectNames pattern,去加載不同功用的interceptor。

另外一個最大的好處是,這個針對的是Object Names,也就是只針對設定檔上的object id,只要改設定檔,程式不用動,就可以決定有哪些object要加載或卸載Aop模組。

結論
一連串的Aop文章,希望可以幫助大家設計出真的有彈性、低耦合的系統架構出來。

 


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