Использование именованной инъекции в 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 2

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