我的用例是这样的:
对象请求特定类型的未绑定(bind)@Named 注入(inject)。我希望 Guice 告诉我的“回退”提供者名称值是什么(或给我整个注释),这样我的提供者仍然可以提供基于名称值的实现。
@Named 值因此用作在运行时查找正确实现的键。如果根据@Named 找到实现,则不应咨询提供者。
最佳答案
Guice 基本上是一个从(注释,类型)元组到 Provider<T>
的映射.没有办法将默认绑定(bind)绑定(bind)到所有未绑定(bind)的 @Named
实例比将整个 double 范围绑定(bind)到 Map<Double, String>
中的单个字符串要好得多。 .
如果你有一个方便的数组或所有 @Named
的集合你想要的值,你可以遍历它们并将它们全部绑定(bind)到某种默认提供程序,然后你可以使用 Modules.override()
进行破解或 if
循环内的 block :
public class DefaultNameModule extends AbstractModule() {
@Override public void configure() {
for (String name : YOUR_LIST_OF_NAMES) {
if (properties.contains(name)) {
bindConstant(properties.get(name)).annotatedWith(Names.named(name));
} else {
bind(Foo.class)
.annotatedWith(Names.named(name))
.toProvider(new MyProvider(name));
}
}
}
private static class MyProvider extends Provider<Foo> {
final String name;
MyProvider(String name) {
this.name = name;
}
@Override public Foo get() {
return someValueBasedOn(name);
}
}
}
如果这对您来说太复杂了,请记住您始终可以注入(inject)一个包装了 Properties
的单方法对象的实例。为您访问,在需要时计算默认值。
关于java - 如何为 Google Guice 中的特定类型分配默认的 'fallback' 提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14416085/