Java Guice绑定的提供程序未用于依赖项实现

Java Guice绑定的提供程序未用于依赖项实现,java,dependency-injection,guice,guice-3,Java,Dependency Injection,Guice,Guice 3,我正在尝试使用提供程序注入将预配置的对象注入工厂: public class CacheBuilderProvider implements Provider<CacheBuilder<Object, Object>> { public CacheBuilder<Object, Object> get () { //Log the cache builder parameters before creation

我正在尝试使用提供程序注入将预配置的对象注入工厂:

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);
    }
}
当我试图运行此代码时,我得到一个
CreationException

1) No implementation for com.google.common.cache.CacheBuilder annotated with @com.google.inject.name.Named(value=MyCacheBuilder) was bound. 1) com.google.common.cache.CacheBuilder没有实现 绑定了@com.google.inject.name.Named(value=MyCacheBuilder)注释。 我还在类和构造函数声明中尝试了各种原始类型引用和泛型类型引用的组合,但没有取得额外的成功

我可以通过简单地创建提供程序并绑定从
get()
本人返回的实例来解决这个问题,但我希望(和deisre)Guice能为我做到这一点

我的设置是否有细微(或明显)的错误?

这可能会起作用:

bind(new TypeLiteral<CacheBuilder<Object, Object>>() {})
          .annotatedWith(Names.named("MyCacheBuilder"))
          .toProvider(CacheBuilderProvider.class)
          .in(Singleton.class);
bind(新的TypeLiteral(){})
.annotatedWith(name.named(“MyCacheBuilder”))
.toProvider(CacheBuilderProvider.class)
.在(独生子女班);

这里的神奇之处在于
TypeLiteral
类,您应该阅读它。基本上,它是一种允许您绑定到泛型类型的方法(在您的示例中是
CacheBuilder
)。这种魔力是必要的,因为Java使用擦除实现泛型,所以您不能只编写
CacheBuilder.class

谢谢;这就成功了。您是否介意添加一些关于此绑定与普通的
CacheBuilder.class
绑定之间的基本区别的解释?我已经添加了更多的解释。谢谢您的额外帮助。我承认在这个问题上有些无知,尽管我已经通读了那些javadocs;在我问之前,我没能对这些差异做更多的研究。再次感谢。
bind(new TypeLiteral<CacheBuilder<Object, Object>>() {})
          .annotatedWith(Names.named("MyCacheBuilder"))
          .toProvider(CacheBuilderProvider.class)
          .in(Singleton.class);