小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

9.6.1 可用的TargetSource實現(xiàn)類(2)(雙數(shù)據(jù)源交換)

 X的世界 2012-08-06


《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使用示例

  1. ...  
  2.  
  3. Object proxy = ctx.getBean("taskProxy");  
  4. Object initTarget = ((Advised)proxy).getTargetSource().getTarget();  
  5.  
  6. HotSwappableTargetSource hotSwapTargetSource = ?  
  7. (HotSwappableTargetSource)ctx.getBean("hotSwapTargetSource");  
  8. Object oldTarget = hotSwapTargetSource.swap(new ITask(){  
  9.     public void execute(TaskExecutionContext ctx) {  
  10.         // 省略  
  11.     }});  
  12. Object newTarget = ((Advised)proxy).getTargetSource().getTarget();  
  13.  
  14. assertSame(initTarget, oldTarget);  
  15. assertNotSame(initTarget,newTarget); 

能最快記起來的使用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使用配置示例

  1. <bean id="target" class="..." singleton="false"/>  
  2.  
  3. <bean id="poolingTargetSource" class="org.
    springframework.aop.target.CommonsPoolTargetSource"
    >  
  4.     <property name="targetBeanName">  
  5.         <value>target</value>  
  6.     </property>  
  7. </bean>  
  8.  
  9. <bean id="targetProxy" class="org.springframework.
    aop.framework.ProxyFactoryBean"
    >  
  10.     <property name="targetSource">  
  11.         <ref bean="poolingTargetSource"/>  
  12.     </property>  
  13.     <property name="interceptorNames">  
  14.         <list>  
  15.             <value>anyInterceptor</value>  
  16.         </list>  
  17.     </property>  
  18. </bean> 

在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使用配置示例

  1. <bean id="target" class="..." singleton="false"/>  
  2.  
  3. <bean id="threadLocalTargetSource" ?  
  4. class="org.springframework.aop.target.ThreadLocalTargetSource">  
  5.     <property name="targetBeanName">  
  6.         <value>target</value>  
  7.     </property>  
  8. </bean>  
  9.  
  10. <bean id="targetProxy" class="org.springframework.
    aop.framework.ProxyFactoryBean"
    >  
  11.     <property name="targetSource">  
  12.         <ref bean="threadLocalTargetSource"/>  
  13.     </property>  
  14.     <property name="interceptorNames">  
  15.         <list>  
  16.             <value>anyInterceptor</value>  
  17.         </list>  
  18.     </property>  
  19. </bean> 

我想你不會忘記將目標對象的bean定義的scope設置成prototype型吧。畢竟人家每個線程起碼得有自己的目標對象實例不是?不過沒關系,要是非設置成singleton的,Spring AOP會"給你好看"的啦,呵呵,異常伺候!


    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多