|
《Spring揭秘》第9章Spring AOP一世,本章我們詳盡剖析了Spring AOP中的各種概念和實現(xiàn)原理,這些概念和實現(xiàn)原理是Spring AOP發(fā)布之初就確定的,是整個框架的基礎。本節(jié)為大家介紹可用的TargetSource實現(xiàn)類。 AD:
9.6.1 可用的TargetSource實現(xiàn)類(2) 我們使用構造方法注入為HotSwappableTargetSource注入了初始的目標對象,之后,就可以在程序中對其進行操作,如代碼清單9-42所示。 代碼清單9-42 HotSwappableTargetSource使用示例
能最快記起來的使用HotSwappableTargetSource的場景,就是我曾經(jīng)在2005年使用它解決了雙數(shù)據(jù)源的互換問題:在有兩個數(shù)據(jù)庫雙機熱備的情況下,如果一個數(shù)據(jù)庫掛掉,則將程序迅速地切換到另一個數(shù)據(jù)庫。當時,使用了ThrowsAdvice對數(shù)據(jù)庫相關異常進行捕捉,在捕捉到必要的切換信息后,就調用HotSwappableTargetSource的swap方法使用新的數(shù)據(jù)源替換舊的數(shù)據(jù)源,具體詳情可以參照我的博客文章《對雙數(shù)據(jù)源互換的實現(xiàn)的改進》(http://darrenwang. blogcn.com/diary,101689446.shtml)。 總之,使用HotSwappableTargetSource,我們可以在任何合適的地方、合適的時機對舊的目標對象進行替換,比如可以在某個攔截器中持有相關HotSwappableTargetSource的引用,一旦滿足相應的條件,就可以調用swap方法動態(tài)替換新的目標對象,也可以設置一個定時任務,讓它也持有一個HotSwappableTargetSource的引用,每隔一段時間就使用新的目標對象置換掉舊的,等等諸如此類的場景。有關HotSwappableTargetSource的使用,還是有待你自己去挖掘吧! 4. CommonsPoolTargetSource 某些時候,我們可能不想每次都返回新的目標對象,而是想返回有限數(shù)目的目標對象實例,這些目標對象實例的"地位"是平等的,就好像數(shù)據(jù)庫連接池中的那些Connection一樣,我們可以提供一個目標對象的對象池,然后讓某個TargetSource實現(xiàn)每次都從這個目標對象池中去取得目標對象。 CommonsPoolTargetSource就是這么一個TargetSource實現(xiàn),它使用現(xiàn)有的Jakarta Commons Pool提供對象池支持。使用它,跟使用PrototypeTargetSource沒什么太大差別,如代碼清單9-43所示。 代碼清單9-43 CommonsPoolTargetSource使用配置示例
在CommonsPoolTargetSource的使用上,需要注意的問題跟PrototypeTargetSource差不多,即注意它要使用prototype型scope的bean定義。CommonsPoolTargetSource還有許多控制對象池的可配置屬性,比如對象池的大小、初始對象數(shù)量等,都可以在配置中指定。詳情可參照CommonsPool- TargetSource的Javadoc文檔。 如果CommonsPoolTargetSource不能滿足要求,或者因為其他原因不能使用Jakarta Commons Pool,那么也可以通過擴展org.springframework.aop.target.AbstractPoolingTargetSource類,實現(xiàn)相應的提供對象池化功能的TargetSource。有關擴展AbstractPoolingTargetSource的更多信息,可以參考它的Javadoc或者源碼,畢竟Spring是開源的嘛! 5. ThreadLocalTargetSource 如果想為不同的線程調用提供不同的目標對象,那么可以使用org.springframework.aop. target.ThreadLocalTargetSource。它可以保證各自線程上對目標對象的調用,可以被分配到當前線程對應的那個目標對象實例上。其實,ThreadLocalTargetSource無非就是對JDK標準的Thread- Local進行了簡單的封裝而已。 與其他TargetSource類似,ThreadLocalTargetSource的使用也比較簡單,見代碼清單9-44。 代碼清單9-44 ThreadLocalTargetSource使用配置示例
我想你不會忘記將目標對象的bean定義的scope設置成prototype型吧。畢竟人家每個線程起碼得有自己的目標對象實例不是?不過沒關系,要是非設置成singleton的,Spring AOP會"給你好看"的啦,呵呵,異常伺候! |
|
|