2012-03-15 71 views
2

我嘗試使用提供商注射注入預配置的對象到工廠:吉斯約束供應商不被用於履行依賴

public class CacheBuilderProvider 
    implements Provider<CacheBuilder<Object, Object>> { 
    public CacheBuilder<Object, Object> get() { 
     //Log the cache builder parameters before creation 

     CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder(); 
     //configure the cacheBuilder 
     return cacheBuilder; 
    } 
} 

public class MyCacheFactory { 
    private final CacheBuilder<Object, Object> cacheBuilder; 

    @Inject 
    public MyFactory(CacheBuilder<Object, Object> cacheBuilder) { 
     this.cacheBuilder = cacheBuilder; 
    } 
} 

public class CacheModule extends AbstractModule {    
    @Override 
    protected void configure() { 
     bind(CacheBuilder.class) 
      .toProvider(CacheBuilderProvider.class) 
      .in(Singleton.class); 
     bind(MyCacheFactory.class) 
      .in(Singleton.class); 
    } 
} 

當我使用注射器獲得MyCacheFactory實例,我沒有日誌輸出和一個未配置的實例;我的配置都沒有被應用。設置斷點可以驗證提供程序從未被使用。

我也試過在適當件申請@Named("MyCacheBuilder")

public class CacheBuilderProvider 
    implements Provider<CacheBuilder<Object, Object>> { 
    @Named("MyCacheBuilder") 
    public CacheBuilder<Object, Object> get() { //... } 
} 

public class MyCacheFactory { 
    //... 

    @Inject 
    public MyFactory(
     @Named("MyCacheBuilder") 
     CacheBuilder<Object, Object> cacheBuilder 
    ) { 
     //... 
    } 
} 

當我嘗試運行此代碼,我得到一個CreationException

 
1) No implementation for com.google.common.cache.CacheBuilder 
annotated with @com.google.inject.name.Named(value=MyCacheBuilder) was bound. 

我也嘗試各種組合在類和構造函數聲明中的原始和泛型類型引用,沒有額外的成功。

我可以通過簡單地創建提供程序並綁定自己從get()返回的實例來解決此問題,但我希望(和deisre)Guice能爲我做到這一點。

我的設置是否存在某些微妙(或明顯)錯誤?

回答

2

這可能會實現:

bind(new TypeLiteral<CacheBuilder<Object, Object>>() {}) 
      .annotatedWith(Names.named("MyCacheBuilder")) 
      .toProvider(CacheBuilderProvider.class) 
      .in(Singleton.class); 

的魔術位這裏是TypeLiteral類,其Javadoc documentation你應該閱讀。基本上它是一種允許你綁定到一個通用類型(在你的情況下爲CacheBuilder<Object, Object>)的方法。這種魔力是必要的,因爲Java使用擦除來實現泛型,所以你不能只寫CacheBuilder<Object, Object>.class

+0

謝謝;那就是訣竅。你介意添加一些關於這個和普通的'CacheBuilder.class'綁定之間的基本區別的解釋嗎? – arootbeer 2012-03-15 22:02:26

+0

我已經添加了更多的解釋。 – 2012-03-15 22:25:51

+0

感謝您的額外支持。我承認對這個問題有些無知,儘管我已經讀過這些javadocs;在我問之前,我無法對這些差異做更多的研究。再次感謝。 – arootbeer 2012-03-17 01:55:51