提供者可以在不同实例之间进行选择

时间:2016-12-01 08:07:09

标签: java dependency-injection guice

我有一个设置,我绑定一个类的多个实例。类之间的差异是一个输入参数。这两个实例总是被注入。

绑定看起来像这样。

CmsExportAwsWriterSingle cmsExportAwsWriterSingleTranslation = new CmsExportAwsWriterSingle("testing-v1", getCredentials(id, secret));
bind(CmsExportWriter.class)
.annotatedWith(Names.named("config:export.writer.translation"))
.toInstance(cmsExportAwsWriterSingleTranslation);

CmsExportAwsWriterSingle cmsExportAwsWriterSingleReview = new CmsExportAwsWriterSingle("prod-v1", getCredentials(id, secret));
bind(CmsExportWriter.class)
.annotatedWith(Names.named("config:export.writer.review"))
.toInstance(cmsExportAwsWriterSingleReview);

现在我有两个使用javax.inject Provider的服务给我一个编写器的实例。

@Inject
public ServiceOne(Provider<CmsExportWriter> writer) {
   CmsExportWriter writer = writer.get();
}

@Inject
public ServiceTwo(Provider<CmsExportWriter> writer) {
   CmsExportWriter writer = writer.get();
}

有没有办法让提供商给我正确的设置中注入的类的实例?

E.g如果我希望ServiceOne获得名为"config:export.writer.translation"的作家 并ServiceTwo获取"config:export.writer.review"

或者我是否必须放弃提供程序并在服务的构造函数中使用@Named

public ServiceTwo(@Named("config:export.writer.review") CmsExportWriter writer)

使用@Named不会像提供商那样给我额外的好处。我每次都需要它成为作家的新实例。

看起来要做的就是注入提供者。

1 个答案:

答案 0 :(得分:0)

提供程序用于在每次调用get方法时创建新实例。这适用于这样的情况,即在创建封闭对象时不能/不应该注入依赖项实例,或者如果需要多个实例等。这对于多个绑定的注入没有任何作用。

使用多个绑定注入实例的正确方法是通过绑定注释。绑定注释有两种类型:内置@Named注释或自定义注释,应根据标准模板实现。

您可以找到一些示例here