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能爲我做到這一點。
我的設置是否存在某些微妙(或明顯)錯誤?
謝謝;那就是訣竅。你介意添加一些關於這個和普通的'CacheBuilder.class'綁定之間的基本區別的解釋嗎? – arootbeer 2012-03-15 22:02:26
我已經添加了更多的解釋。 – 2012-03-15 22:25:51
感謝您的額外支持。我承認對這個問題有些無知,儘管我已經讀過這些javadocs;在我問之前,我無法對這些差異做更多的研究。再次感謝。 – arootbeer 2012-03-17 01:55:51