Guice의 인젝터에서 주석이 달린 인스턴스를 검색하는 방법은 무엇입니까?


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

답변:


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

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
원래 솔루션이 특별히 명명 된 사양에 대한 것이라고 언급 할 가치가 있다고 생각합니다. 생성 한 Annotation (특정 Interface @Annotation)이있는 경우 getMethod 특정 방식으로 호출하면됩니다. injector.getInstance (Key.get (DesiredObject.class, Annotation.class));
BoneSmuggler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.