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 上的细节,你可能需要设置额外的限定符以避免歧义。