如何为一个类实例化多个CDI / Weld bean?

时间:2010-02-23 14:31:23

标签: java-ee java-ee-6 cdi jboss-weld jsr299

在Spring中,可以通过在xml conf中定义相应的bean来实例化任何类。也可以为具有不同参数的同一类实例化多个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>

如何实例化同一个类的两个实例并使用不同的字段值初始化它们?

3 个答案:

答案 0 :(得分:4)

据我所见,有两个选项:

  • 如果不进一步了解您的用例,我假设您要么为(模拟)测试或配置问题提供一些替代实现(比如说OrderService的另一个PaymentProvider)。这是由规范本身支持的,看看@Alternative here(并且不要重复我最初的错误,忘记激活beans.xml中的替代品)

  • 要获得Spring风格的XML配置,您可以使用Seam 3 Config,它提供的XML配置与描述完全相同。顺便说一句,这是JSR 299的一部分,但无论出于何种原因已从规范中删除。

答案 1 :(得分:2)

有几种方法可以做到这一点。

E.g。使用@New

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

这会强制容器创建一个新实例,无论bean最初具有什么范围。

另一种方法是简单地将YourBean定义为@Dependent作用域(如果没有注释类,则btw(当前)是默认值。)

答案 2 :(得分:2)

您可以轻松使用生成器方法,如果您有多个应由方法生成的实例,请使用CDI限定符来区分不同类型的实例。

此外,您可以使用Seam Config以Spring方式执行,但我认为生产者方法是更优雅的方式。 根据您的使用案例,还有另一种选择,即@Alternative。