【问题标题】:how to instantiate more than one CDI/Weld bean for one class?如何为一个类实例化多个 CDI/Weld bean?
【发布时间】:2010-02-23 14:31:23
【问题描述】:

在 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>

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

【问题讨论】:

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


    【解决方案1】:

    据我所知有两个选项:

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

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

    【讨论】:

    【解决方案2】:

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

    例如使用@New

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

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

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

    【讨论】:

    • 那么属性呢?他们会被注射吗?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2011-05-31
      • 2017-09-17
      • 1970-01-01
      相关资源
      最近更新 更多