2009-01-12 93 views
1

我需要在幾個類中必須始終遵循特定的前和後模式的方法。春天依賴注入或方面編程

公共無效方法(X X,Y y)的{

// ************重複部分開始************** ****/

aFrameworkClass aFrameworkClass =新aFrameworkClass(this.memberVariable 「SomeString」);

嘗試{

aFrameworkClass.aFrameworkMethod(x,y); 
    aFrameworkClass.anotherFrameworkMethod(x,y); 
    aFrameworkClass.yetAnotherFrameworkMethod(x); 
    aFrameworkClass.doPreProcessing(); 

    Throwable t = null ; 

// ************重複部分末端******************/

try { 
    // code will vary according to the business logic 
    } 
    catch (Throwable t) { 
    // code will vary according to the business logic 
    } 

// ************重複部分開始******************/

aFrameworkClass.doPostProcessing(); 

} finally { aFrameworkClass.doCleanup();

}

// ************重複部分末端******************/

}

是否可以使用Spring框架來實現,在這種方法的重複部分的邏輯,而不必對這些線在我的各類一遍又一遍的代碼?如果是這樣如何?

回答

2

絕對可以用Spring的AOP支持完成。您可以將第一部分爲「前」的建議和第二爲「後終於」的建議,也可以爲「繞」的建議同時應用和編程調用目標方法,像這樣:

methodInvocation.invoke(); // returns Object 

如果你想聲明XML格式的方面,你可以瞭解如何在這裏做到這一點:

http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-schema http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-schema-advice-before http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-schema-advice-after-finally http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-ataspectj-around-advice

或者,如果你想與註解做到這一點有信息在這裏:

http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-ataspectj

我個人更喜歡用XML做它,因爲各方面的行爲,不需要重新編譯應用而改變。假設您有一個多模塊項目,其中B依賴於A.一個包含可重用的建議並正在使用批註,命令,切入點等。如果需要更改該行爲,則必須重建A.如果在項目B中使用XML要從項目A配置方面,不需要重建A.

我的感覺是,建議被更可重複使用的,當你定義一個類,以及如何行爲在XML應用的行爲。

+0

您指的是'我個人更喜歡用XML來做它,因爲可以在不重新編譯應用程序的情況下更改方面的行爲',您究竟在說什麼? – krosenvold 2009-01-13 06:44:20

+0

AspectJ API中有註釋允許您在Java代碼中定義AOP行爲: http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-ataspectj 例如,您可以使用@Order指定建議訂單。我寧願使用XML來代替;易於更改,無需編譯 – 2009-01-15 21:13:51

+0

XMl配置文件通常打包在EAR或WAR中。您將不得不重建項目進行重新打包,這反過來又引入了需求迴歸測試 – zkarthik 2009-01-16 02:34:20

0

brd6644是正確的,但有一件事我發現是一個問題,Spring AOP是有關的意見/顧問不能爲正在創建的對象應用於屬性。

也就是說,假設你有類似

<bean class="...ProxyBeanFactory"> 
    <property name="target"> 
     <bean class="myBean"> 
      <property name="username" value="helloKitty"/> 
      <property name="password" value="lkajdahdkahjdkhja"/> 
     </bean> 
    </property> 
</bean> 

這是不可能寫一個顧問解密的爲myBean的密碼,因爲在創建代理之前被提供的屬性值。當然,您無法將密碼屬性應用於ProxyBeanFactory類。你真正想要做的就是從ProxyBeanFactory返回的具有「lkaj ...」參數的對象上調用setPassword(),但這似乎是不可能的。

1

作爲一個完整的IoC容器的替代方案,您可以使用委託來實現同樣的功能。使用前後函數和委託來設計一個基類,以注入不斷變化的業務邏輯函數。一個「RunProcess」基類函數會調用預操作,委託,然後是後操作。