Использование именованной инъекции в Guice
Я использую Guice для инъекции зависимостей, и я немного запутался. В разных пакетах есть две аннотации Named
:
com.google.inject.name.Named
и javax.inject.Named
(JSR 330?).
Я очень хочу зависеть от javax.inject.*
. Пример кода:
import javax.inject.Inject;
import javax.inject.Named;
public class MyClass
{
@Inject
@Named("APrefix_CustomerTypeProvider")
private CustomerTypeProvider customerTypeProvider;
}
В моем модуле именования у меня может быть следующая строка:
bind(CustomerTypeProvider.class).annotatedWith(...).toProvider(CustomerTypeProviderProvider.class);
Вопрос: мне интересно, что я должен поставить там, где находятся точки? Я ожидал бы что-то вроде com.google.inject.name.Names.named("APrefix_CustomerTypeProvider")
, но этот возвращает com.google.inject.name.Named
, в то время как мне нужен один в javax.inject
.
CustomerTypeProviderProvider.class.getAnnotation(javax.inject.Named.class)
также не подходит хорошо, потому что CustomerTypeProviderProvider
(игнорируйте глупое имя, наследственный вопрос) не аннотируется.
1 ответ:
Как уже упоминалось в Guice wiki, оба работают одинаково. Тебе не стоит беспокоиться об этом. Даже рекомендуется использовать
javax.inject.*
, когда это доступно, так же, как вы предпочитаете тоже (внизу той же страницы).import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.name.Names; import javax.inject.Inject; public class Main { static class Holder { @Inject @javax.inject.Named("foo") String javaNamed; @Inject @com.google.inject.name.Named("foo") String guiceNamed; } public static void main(String[] args) { Holder holder = Guice.createInjector(new AbstractModule(){ @Override protected void configure() { // Only one injection, using c.g.i.Names.named(""). bind(String.class).annotatedWith(Names.named("foo")).toInstance("foo"); } }).getInstance(Holder.class); System.out.printf("javax.inject: %s%n", holder.javaNamed); System.out.printf("guice: %s%n", holder.guiceNamed); } }
Отпечатки пальцев:
java.inject: foo guice: foo