6

在 Spring 中,可以通过在 xml conf 中定义相应的 bean 来实例化任何类。还可以为具有不同参数的同一类实例化多个 bean .....

CDI 中是否也有这样的功能,即是否可以使用不同的初始化参数创建同一类的不同实例?

是否也可以在不更改类的情况下创建 bean....我的意思是不添加注释?

添加

让我举个例子。

<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

3 回答 3

4

据我所知,有两个选择:

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

  • 要获得 Spring 风格的 XML 配置,您可以使用Seam 3 Config,它提供了如前所述的 XML 配置。顺便说一句,这已成为 JSR 299 的一部分,但出于某种原因已从规范中删除。

于 2011-04-04T14:05:25.610 回答
2

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

你也可以使用 Seam Config 来做 Spring 方式,但我认为生产者方法是更优雅的方式。根据您的用例,还有另一个选项是 @Alternative 。

于 2012-05-22T04:00:04.960 回答
2

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

例如使用@New

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

这会强制容器创建一个新实例,而不管 bean 最初的 Scope 是什么。

另一种方法是简单地将 YourBean 定义为 @Dependent 范围(顺便说一句(当前),如果一个类根本没有注释,则默认值)。

于 2010-02-26T18:15:56.427 回答