Wie kann ich eine kommentierte Instanz von Guices Injektor abrufen?

86

Angenommen, ich habe ein Modul:

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

und ich möchte das Modul testen und prüfen, ob es den richtigen Wert in ein mit StringAnmerkungen versehenes Feld einfügt, Names.named("annotation")ohne eine Klasse und ein Feld zu haben, aber den Wert direkt vom Injektor zu erhalten:

@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ć
quelle

Antworten:

205
injector.getInstance(Key.get(String.class, Names.named("annotation")));
ColinD
quelle
14

Ich benutze die folgende Methode

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

dafür. Im Allgemeinen haben Sie immer noch das Problem, die Anmerkungsinstanz zu erstellen, aber hier Names.named("annotation")funktioniert es.

Maaartinus
quelle
4
Ich denke, dass es erwähnenswert ist, dass die ursprüngliche Lösung speziell für die Named-Spezifikation ist. Wenn Sie eine Annotation (bestimmte Schnittstelle @Annotation) erstellt haben, führen Sie den Aufruf einfach als getMethod-spezifisch durch: injizor.getInstance (Key.get (DesiredObject.class, Annotation.class));
BoneSmuggler