2011-03-07 53 views
1

讓我們想象一下,有1000個類(X1 ... X1000),它們都在庫中定義。一個關於Spring的簡單問題IoC

的X *類已經使用了一些JSR-330註解,比如:

class X12 { 

    @Inject 
    Foo foo; 

    @Inject 
    Bar bar; 

} 

我的主類是一個測試用例@RunWith(SpringJUnit4ClassRunner.class),並且引用FooBar在bean的XML文件中明確界定。

問題是,我不想在任何XML文件中定義X1 ... X1000。但我想自動連線它們,例如:

X173 x173 = new X173(); 

但問題是,使用Java新實例,foo/bar沒有連線。

這還沒有作品:

X173 x173 = applicationContext.getBean(X173.class); 

因爲X173沒有豆定義。

而且,X173也可能包含類X258的成員,它也應該連線。在解決這個問題之前,我無法弄清楚如何實現它。

回答

3

您可以使用autodetection將它們聲明爲Spring bean。

最明顯的方法是用Spring註釋(例如@Component)註釋這些類,然後將<context:component-scan />添加到您的XML中。

如果註釋不是一個選項,<context:component-scan />支持可配置的過濾器。例如,如果這些類實際上是一個名爲X1...X1000,您可以使用正則表達式過濾器:

<context:component-scan base-package="com.example"> 
    <context:include-filter type="regex" expression="com\.example\.X\d{1,4}"/> 
</context:component-scan> 
+0

不幸的是,類名是任意的。嗯..我認爲'組件掃描'會得到不必要的副作用。當我編寫'applicationContext.getBean(X173.class)'時,我確切地知道將會注入什麼,但'component-scan'看起來很粗糙。 – 2011-03-07 10:41:45

+0

+1很好答案。 – Nilesh 2011-03-07 10:49:40

+1

@繼雷'Lenik:你的問題違背了Spring的概念,因爲Spring從預定義的bean定義中創建bean,而不是以特別的方式。您可以使用'applicationContext.getAutowireCapableBeanFactory()。createBean(X173.class)'創建一個沒有定義的bean,但它不滿足最後一項要求(bean的相互依賴關係)。 – axtavt 2011-03-07 11:17:44

0

確定。有不同類型的測試。我們來看看他們。

  • 在模塊化測試中,您應該測試單個類並模擬它的依賴性。所以,你應該避免任何注射器。

  • 在集成中,您應該測試某個類的交互,因此您可以像在平常應用程序中那樣使用注入器。

+0

對於模塊化測試,爲什麼不直接注入模擬實例? (通過指定測試用途上下文xml) – 2011-03-07 10:45:49

+0

@謝繼雷'Lenik,最好的注入是構造函數注入。因此,在模塊化測試中,您應該爲構造函數提供一些實例。它可以並且應該是模擬的。 – 2011-03-07 10:46:13

+0

@謝繼雷'Lenik,我沒有得到「嘲弄的例子」。請你澄清一下。 – 2011-03-07 10:47:18