2016-12-01 4 views
1

У меня есть настройка, где я связываю несколько экземпляров одного класса. Разница между классами - это один входной параметр. Два экземпляра всегда вводятся.Может ли поставщик выбирать между разными экземплярами

Эти крепления выглядят следующим образом.

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(); 
} 

Есть ли способ заставить провайдера дать мне правильные экземпляры классов, которые я ввел в настройку?

Если например я хочу ServiceOne получить Writer с именем "config:export.writer.translation" И ServiceTwo"config:export.writer.review" получить

Или я должен abandond провайдера и использовать @Named в конструкторах услуг.

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

Просто использование @Named не даст мне льготы в качестве Провайдера. И мне нужно, чтобы это были новые экземпляры писателей каждый раз.

Похоже, что путь заключается в том, чтобы вместо этого вводить Провайдеров.

ответ

0

Поставщик служит для создания нового экземпляра при каждом вызове метода get. Это подходит для случая, когда экземпляр зависимостей не может/не следует вводить при создании закрывающего объекта или если требуется несколько экземпляров и т. Д. Это не делает ничего с инъекцией для нескольких привязок.

Правильный способ ввода экземпляров с несколькими связями - это привязка аннотаций. Существует два типа аннотаций привязки: встроенная аннотация @Named или пользовательская аннотация, которая должна быть реализована в соответствии со стандартным шаблоном.

Вы можете найти несколько примеров: here

Смежные вопросы