2010-02-23 142 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。

相关问题