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");
}

Antworten:


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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.