Como recuperar a instância anotada do injetor de Guice?

89

Digamos que eu tenha um módulo:

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

e quero testar o módulo e verificar se ele injeta o valor correto em um Stringcampo anotado com Names.named("annotation")sem ter uma classe e um campo, mas obtendo o valor diretamente do injetor:

@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");
}
Boris Pavlović
fonte

Respostas:

209
injector.getInstance(Key.get(String.class, Names.named("annotation")));
ColinD
fonte
15

Estou usando o seguinte método

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

por esta. Em geral, você ainda tem o problema de criar a instância de anotação, mas aqui Names.named("annotation")funciona.

maaartinus
fonte
4
Acho que merece menção que a solução original é especificamente para a especificação nomeada. Se você tiver uma Annotation (Interface @Annotation específica) que criou, basta fazer a chamada como getMethod específico: injector.getInstance (Key.get (DesiredObject.class, Annotation.class));
BoneSmuggler