吉斯约束供应商不被用于履行依赖
问题描述:
我尝试使用提供商注射注入预配置的对象到工厂:吉斯约束供应商不被用于履行依赖
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能为我做到这一点。
我的设置是否存在某些微妙(或明显)错误?
答
这可能会实现:
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
。
谢谢;那就是诀窍。你介意添加一些关于这个和普通的'CacheBuilder.class'绑定之间的基本区别的解释吗? – arootbeer 2012-03-15 22:02:26
我已经添加了更多的解释。 – 2012-03-15 22:25:51
感谢您的额外支持。我承认对这个问题有些无知,尽管我已经读过这些javadocs;在我问之前,我无法对这些差异做更多的研究。再次感谢。 – arootbeer 2012-03-17 01:55:51