我将为 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。