2011-02-25 27 views
67

Diyelim ki bir modülüm var:Açıklamalı örneği Guice'nin enjektöründen nasıl alabilirim?

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

modülünü test etmek ve Names.named("annotation") ile açıklanmış bir String alanına doğru bir şekilde bir sınıf ve alan olmaksızın doğru değeri enjekte edip etmediğini kontrol etmek istiyorum. enjektör:

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

cevap

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

Ben aşağıdaki yöntemi

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

için kullanıyorum bu. Genel olarak, ek açıklama örneğini oluşturma konusunda hala sorun var, ancak burada Names.named("annotation") çalışır.

+4

Özgün çözümün Adlandırılmış belirtim için özel olduğunu belirtmek gerektiğini düşünüyorum. Oluşturduğunuz bir Ek Açıklama (spesifik Arabirim @Annotation) varsa, çağrıyı yalnızca getMethod özel olarak yapın: injector.getInstance (Key.get (DesiredObject.class, Annotation.class)); – BoneSmuggler