CDI 和多个实例
CDI and multiple instances
我只是在研究 DI 框架的可能性,并为此做了一些愚蠢的例子。我有简单的服务。
public class Service implements ServiceI {
private Source source;
private Translator translator;
@Inject
public Service(Translator translator, Source source) {
this.translator = translator;
this.source = source;
}
我想要此服务的两个实例,一个由 TranslatorA 和 SourceA 启动,另一个将注入不同的值。
一个人如何拥有两个注入了不同 bean 的实例?
我对如何在 Guice 和 Weld CDI 中实现这一点很感兴趣。
到目前为止,我创建了多个 Guice 模块,并根据需要在其中指定绑定。但我不完全确定这是否是正确的方法。这在 CDI 中完全失败,因为没有模块。
我觉得有多个实例一定很常见,还是我错了?
使用 CDI 执行此操作的方法是为翻译器和源代码设置制作人。这是在运行时控制哪些实现用于注入的唯一方法。实施细节可能会根据您的具体需求而有所不同,但像这样的事情应该会让您走上正轨
@Produces
public Translator produceTranslator(@Dependent TranslatorA implA, @Dependent TranslatorB implB) {
return checkRuntimeCondition() ? implA : implB;
}
来源也一样。这样,当您注入服务时,CDI 将为每个参数调用生产者方法,并使用运行时条件 select 实现。 YMMV 上的细节,你可能需要设置额外的限定符以避免歧义。
我只是在研究 DI 框架的可能性,并为此做了一些愚蠢的例子。我有简单的服务。
public class Service implements ServiceI {
private Source source;
private Translator translator;
@Inject
public Service(Translator translator, Source source) {
this.translator = translator;
this.source = source;
}
我想要此服务的两个实例,一个由 TranslatorA 和 SourceA 启动,另一个将注入不同的值。
一个人如何拥有两个注入了不同 bean 的实例?
我对如何在 Guice 和 Weld CDI 中实现这一点很感兴趣。
到目前为止,我创建了多个 Guice 模块,并根据需要在其中指定绑定。但我不完全确定这是否是正确的方法。这在 CDI 中完全失败,因为没有模块。
我觉得有多个实例一定很常见,还是我错了?
使用 CDI 执行此操作的方法是为翻译器和源代码设置制作人。这是在运行时控制哪些实现用于注入的唯一方法。实施细节可能会根据您的具体需求而有所不同,但像这样的事情应该会让您走上正轨
@Produces
public Translator produceTranslator(@Dependent TranslatorA implA, @Dependent TranslatorB implB) {
return checkRuntimeCondition() ? implA : implB;
}
来源也一样。这样,当您注入服务时,CDI 将为每个参数调用生产者方法,并使用运行时条件 select 实现。 YMMV 上的细节,你可能需要设置额外的限定符以避免歧义。