2011-02-25 104 views
67

比方说,我有一个模块:如何从Guice的注入器中检索带注释的实例?

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

,我要测试的模块,并检查它是否注入在StringNames.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"); 
} 

回答

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

我用下面的方法

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(特定接口@Annotation),那么您只需将该调用作为getMethod特定的: injector.getInstance(Key.get(DesiredObject.class,Annotation.class)); – BoneSmuggler 2016-07-13 19:03:56