2012-07-05 45 views
1

我們有一個基於Spring的大型應用程序,它包含不同的模塊,但也包含自定義的API。雖然有些模塊需要Spring上下文,因爲它們只是包裝部分域模型,但我們認爲我們的某些API不包含這些模塊。開發Java API並將其包含在Spring應用程序中

例如,我們爲Jackson/Jersey提供了一個包裝來提供和使用REST服務。有一個訪問此API的中央界面。然而,實現需要另一個類和另一個類等。因此,一個簡單的初始化將是

A a = new A(new B(new C(), new D(new E()))) 

我們目前使用@Inject保存。此API的上下文掃描包,然後導入到目標應用程序。

<import resource="classpath:api-context.xml" /> 

我們不覺得舒服這一點,並想踢Spring上下文了REST包裝的,這意味着我們要的API不要求之一,但不知道如何做到這一點。這應該意味着無論是以下兩個:

構造函數的參數

在目標範圍內,這將需要數豆子各有其依賴

<bean id="a" class="...A"> 
    <constructor-arg> 
     <ref = b " /> 
    </constructor-arg> 
</bean> 

<bean id="b" class="...B"> 
    <constructor-arg> 
     <ref = c " /> 
    </constructor-arg> 
</bean> 
<!-- And so on --> 

getter和setter初始化的創建

或者,假設AAInterface的具體實施,並且A接口是中央訪問我們只能說,A默認使用某實施BInterface的等等,實際上與新設置這些內部:

public class A implements AInterface { 
    private BInterface b = new B(); 
    public getB() {return b;} 
    public setB(B b) {this.b = b) } 
} 
// and so on 

然後在我的目標方面,我可以初始化一箇中央訪問行,如果我想使用默認配置

<bean id="a" class="...A" /> 

或使用性能然而,設置其B.然後,如果我想更遠的路線改變的東西我必須初始化所有豆類和設置的屬性。

另外,如果我在測試之外使用新的服務,它對我來說似乎並不乾淨。


所以,我們想知道如何做其他的API開發使自己的接口和豆類訪問,而不依賴於上下文進口(其中順便說一句也雜波了目標範圍內有許多潛在的不必要的豆類,如例如,如果一個API提供了幾種服務,我只想用一種)?


編輯

不知道任何這是更好的:

public class A implements AInterface { 
    private BInterface b 
    public A() { 
     b = new B(); 
    } 
    public getB() {return b;} 
    public setB(B b) {this.b = b) } 
} 

public class A implements AInterface { 
    private BInterface b 
    public A(B b) { 
     this.b = b; 
    } 
} 

後者認爲從測試的角度來看,但它最好將我們帶回上面描述的鏈中,我將不得不初始化al l在我可以初始化A之前,在我的上下文中依賴於bean。這看起來像是太多的配置開銷。

有人可能會爭辯說,在使用類之前需要初始化所有的依賴關係並且我們應該重構我們的代碼是很正常的。然後,我們最終會得到很多實用/輔助類,這些類也不是最好的設計,因爲它們很難替換或測試。

+1

我真的不確定你的意思是「想踢出REST包裝器的春天背景」,我也不確定你是如何使用上下文的。上下文不必映射到包或API,但可以是體現應用程序的任何bean分組。如果您不想使用軟件包掃描,那麼您別無選擇,只能使用XML或「@ Configuration」單獨定義bean,並在該配置中的Bean之間指定引用,或者使用@Autowired或等效指定。 –

回答

1

基本上,如果你的API不需要Spring上下文,真的沒有理由把它放在那裏。

請注意,第二種方法你建議:

public class A implements AInterface { 
    private BInterface b = new B(); 
    public getB() {return b;} 
    public setB(B b) {this.b = b) } 
} 

它有點問題becasue初始化接口的類中,這將導致你的測試問題,因爲你不能嘲笑這些對象。更好的解決方案是使用它在類的構造函數中初始化它。

+0

是的,雖然通過使用getter/setter我們可以嘲笑這個類,但我認爲測試確實是一個問題。使用構造函數args但是我們最終會得到我描述的鏈......'a a = new A (new B(new C(...)))' – Pete

+0

那麼這主要取決於你的實現,如果你可以使用延遲加載(只在需要時初始化類),那麼你可以初始化A而不需要B,然後初始化B只在需要時使用setter)等等。 – Tomer

相關問題