2011-02-25 36 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