2011-02-25 6 views
67

Digamos que tengo un módulo:¿Cómo recuperar la instancia anotada del inyector de Guice?

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

y quiero probar el módulo y comprobar si se inyecta el valor correcto en un campo String anotado con Names.named("annotation") sin tener una clase y un campo pero la obtención del valor directamente del inyector:

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

Respuesta

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

estoy usando el siguiente método

public <T> T getInstance(Class<T> type, Class<? extends Annotation> option) { 
    final Key<T> key = Key.get(type, option); 
    return injector.getInstance(key); 
} 

de esta. En general, aún tiene el problema de crear la instancia de anotación, pero aquí funciona el Names.named("annotation").

+4

Creo que merece mencionar que la solución original es específicamente para la especificación de nombre. Si tiene una Anotación (Interfaz específica @Anotación) que ha creado, entonces simplemente realiza la llamada como el getMethod específico: injector.getInstance (Key.get (DesiredObject.class, Annotation.class)); – BoneSmuggler

Cuestiones relacionadas