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

ban*_*rCZ 5 java cdi java-ee-7

注意:类似的问题已经在三年前提出过,在EE 6的时候,看看如何为一个类实例化多个CDI/Weld bean?EE 7有什么变化吗?

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

是否可以在CDI中执行此操作,我的意思是创建一个实例而不创建另一个类?

春天的例子:

<bean id="foo" class="MyBean">
    <property name="someProperty" value="42"/>
</bean>
<bean id="hoo" class="MyBean">
    <property name="someProperty" value="666"/>      
</bean>
Run Code Online (Sandbox Code Playgroud)

Jak*_*nek 5

我会为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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你在某个地方做:

    @Inject
    @FooQualifier
    private MyBean foo;
Run Code Online (Sandbox Code Playgroud)

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

@Inject
@HooQualifier
private MyBean hoo;
Run Code Online (Sandbox Code Playgroud)

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

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

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

    @Nonbinding
    int value() default 0;
}
Run Code Online (Sandbox Code Playgroud)

然后生产者方法:

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

然后简单地调用:

@Inject
@ConfigurableQualifier(value = 11)
private MyBean configurableBean;
Run Code Online (Sandbox Code Playgroud)

将导致myBean实例的someProperty等于11.