Как извлечь аннотированный экземпляр из инжектора Guice? - PullRequest
73 голосов
/ 25 февраля 2011

Допустим, у меня есть модуль:

Module extends AbstractModule
{
  @Override
  protected void configure()
  {
    bind(String.class).
      annotatedWith(Names.named("annotation")).
        toInstance("DELIRIOUS");
  }
}

и я хочу проверить модуль и проверить, правильно ли он вводит правильное значение в поле String, помеченное Names.named("annotation"), не имея класса и поля, но получая значение непосредственно из инжектора:

@Test
public void test()
{
  Injector injector = Guice.createInjector(new Module());

  // THIS IS NOT GOING TO WORK!
  String delirious = injector.getInstance(String.class); 

  assertThat(delirious, IsEqual.equalTo("DELIRIOUS");
}

Ответы [ 2 ]

175 голосов
/ 25 февраля 2011
injector.getInstance(Key.get(String.class, Names.named("annotation")));
12 голосов
/ 25 февраля 2011

Я использую следующий метод

public <T> T getInstance(Class<T> type, Class<? extends Annotation> option) {
    final Key<T> key = Key.get(type, option);
    return injector.getInstance(key);
}

для этого.В общем, у вас все еще есть проблема создания экземпляра аннотации, но здесь Names.named("annotation") работает.

...