java - 如何为一个类实例化更多的CDI bean?

标签 java cdi java-ee-7

注意:类似的问题已经在三年前问过,当时是 EE 6,请参阅 how to instantiate more then one CDI/Weld bean for one class? EE 7 有什么变化吗?

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

是否可以在 CDI 中实现,我的意思是创建一个实例而不创建另一个类?

Spring 示例:

<bean id="foo" class="MyBean">
    <property name="someProperty" value="42"/>
</bean>
<bean id="hoo" class="MyBean">
    <property name="someProperty" value="666"/>      
</bean>

最佳答案

我会为 MyBean 创建限定符 FooQualifier、HooQualifier 和 Producer,如下所示:

@ApplicationScoped
public class MyBeanProducer {

    @Produces
    @FooQualifier
    public MyBean fooProducer() {
        return new MyBean(42);
    }

    @Produces
    @HooQualifier
    public MyBean hooProducer() {
        return new MyBean(666);
    }
}

然后如果你在某个地方这样做:

    @Inject
    @FooQualifier
    private MyBean foo;

您将拥有 foo.getSomeProperty() 等于 42 的 MyBean 实例,如果这样做:

@Inject
@HooQualifier
private MyBean hoo;

您将拥有 foo.getSomeProperty() 等于 666 的 MyBean 实例。

另一种可能性是有一个可配置的限定符:

@Target( { TYPE, METHOD, PARAMETER, FIELD })
@Retention(RUNTIME)
@Documented
@Qualifier
public @interface ConfigurableQualifier {

    @Nonbinding
    int value() default 0;
}

然后是生产者方法:

@Produces
@ConfigurableQualifier
public MyBean configurableProducer(InjectionPoint ip){
    int somePropertyValue = ip.getAnnotated().getAnnotation(ConfigurableQualifier.class).value();
    return new MyBean(somePropertyValue);
}

然后简单地调用:

@Inject
@ConfigurableQualifier(value = 11)
private MyBean configurableBean;

将导致 MyBean 实例的 someProperty 等于 11。

关于java - 如何为一个类实例化更多的CDI bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25153624/

相关文章:

java - 我是 Maven 新手,有更好的方法来搜索原型(prototype)吗?

java - DbUnit 和递归实体

java - java中如何测量一个线程从new到结束到底需要多长时间

java - 在 Web 应用程序中 @Inject @Remote EJB

spring - 在 EJB 3.1 或 CDI 中定义并注入(inject)映射

jsf - javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL 自 Java EE 7/EL 3.0 起不再工作

java - 无法解析符号注释设计 ActivityCompat v7

java - LOG4J 作为单例,在服务器停止和启动时关闭附加程序(尝试附加到关闭的附加程序)

java - CDI 可以将标准库 POJO 注入(inject)到 EJB 中吗?

java - 在java中重写equals和hashcode方法?