gpt4 book ai didi

java - Guice 绑定(bind)提供程序未用于依赖项实现

转载 作者:行者123 更新时间:2023-11-30 09:39:41 25 4
gpt4 key购买 nike

我正在尝试使用提供者注入(inject)将预配置的对象注入(inject)工厂:

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);
}
}

当我使用注入(inject)器获得 MyCacheFactory 时例如,我没有日志输出和未配置的 CacheBuilder<Object, Object>实例;我的配置均未应用。设置断点可验证提供程序从未被使用过。

我也试过申请 @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.CacheBuilderannotated with @com.google.inject.name.Named(value=MyCacheBuilder) was bound.

我还在类和构造函数声明中尝试了原始类型引用和泛型类型引用的各种组合,但没有取得额外的成功。

我可以通过简单地创建提供者并绑定(bind)从 get() 返回的实例来解决这个问题我自己,但我希望(并且希望)Guice 会为我做这件事。

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

最佳答案

这可能有效:

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

这里的魔法是 TypeLiteral类,其Javadoc documentation你应该阅读。基本上,这是一种允许您绑定(bind)到通用类型的方法(在您的情况下为 CacheBuilder<Object, Object>)。这个魔法是必要的,因为 Java 使用删除实现泛型,所以你不能只写 CacheBuilder<Object, Object>.class .

关于java - Guice 绑定(bind)提供程序未用于依赖项实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9726924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com