簡體   English   中英

如何為一個類實例化更多的CDI bean?

[英]How to instantiate more CDI beans for one class?

注意 :三年前,在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>

我將為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;

您將擁有MyBean實例,其foo.getSomeProperty()等於42,並且如果這樣做:

@Inject
@HooQualifier
private MyBean hoo;

您將擁有MyBean實例,其foo.getSomeProperty()等於666。

另一種可能性是擁有一個可配置的限定符:

@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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM