Як отримати анотований екземпляр із інжектора Гіса?


88

Скажімо, у мене є модуль:

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

Відповіді:



15

Я використовую наступний метод

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")працює.


4
Я думаю, що варто згадати, що оригінальне рішення спеціально для специфікації Named. Якщо у вас є анотація (конкретний інтерфейс @Annotation), яку ви створили, ви просто робите виклик як конкретний метод getMethod: injector.getInstance (Key.get (DesiredObject.class, Annotation.class));
BoneSmuggler
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.