2010-02-23 56 views
6

在Spring中,可以通過在xml conf中定義相應的bean來實例化任何類。它也可以實例化一個以上的豆用不同的參數相同的類.....如何爲一個類實例化多個CDI/Weld bean?

是在CDI的這種特徵爲好,即是有可能創造具有不同的初始化同一類的不同實例參數?

也可以在不更改類的情況下創建一個bean ....我的意思是沒有添加註釋?

ADDED

讓我舉個例子。

<bean id="someBean1" class="org.mm.MyBean"> 
    <property name="x" value="xx"/> 
    <property name="y" value="yy"/> 
    <property name="z" value="zz"/>  
</bean> 
<bean id="someBean2" class="org.mm.MyBean"> 
    <property name="x" value="other value"/> 
    <property name="y" value="yy2"/> 
    <property name="z" value="zz2"/>  
</bean> 

如何實例化同一個類的兩個實例並用不同的字段值初始化它們?

回答

4

兩個選項,據我可以看到:

  • 沒有你的用例的進一步瞭解,我認爲你要麼需要提供(模擬轉)測試或配置問題的一些替代的實現(比如另一個OrderService的PaymentProvider)。這是由規範本身的支持,看看@Alternativehere(不要重複我的錯誤初期,忘記了激活beans.xml中的替代品)

  • 爲了得到一個Spring風格的XML配置,你可以使用Seam 3 Config,它提供XML配置,如上所述。順便說一下,這已經是JSR 299的一部分,但不管出於何種原因,它已從規範中刪除。

+0

2011年回答。EE7目前的狀況如何? – banterCZ

+0

我不知道。也許開始一個新的問題? –

+0

這裏有這個問題http://stackoverflow.com/questions/25153624/how-to-instantiate-more-cdi-beans-for-one-class – banterCZ

2

有幾種方法可以做到這一點。

E.g.使用@New

private @Inject @New YourBean yb; private @Inject @New YourBean yb2;

這會強制容器創建一個新的實例,而不管該bean原來的範圍如何。

另一種方式是簡單地定義YourBean爲@Dependent範圍的(這是BTW(目前)如果一個類是不是在所有註釋的缺省值)。

+0

和屬性?他們會被注射嗎? – smikesh

2

您可以輕鬆地使用生產方法,如果你有應該由一個方法來製造多個實例使用CDI預選賽區分不同類型的實例。

你也可以使用Seam Config來做到這一點春天的方式,但我認爲生產者的方法是這樣做的更優雅的方式。 根據您的使用情況,還有另一種選擇是@Alternative。

相關問題