2012-03-15 50 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