我的用例是这样的:
对象请求特定类型的未绑定@Named 注入。我希望 Guice 告诉我的“后备”提供者名称值是什么(或给我整个注释),以便我的提供者仍然可以提供基于名称值的实现。
因此,@Named 值用作在运行时查找正确实现的键。如果基于@Named 找到了实现,则不应咨询提供者。
Guice 基本上是从 (annotation, type) 元组到Provider<T>
. 没有办法将默认绑定绑定到所有未绑定的@Named
实例,就像将整个双精度范围绑定到 a 中的单个字符串一样Map<Double, String>
。
如果你有一个方便的数组或@Named
你想要的所有值的集合,你可以循环它们并将它们全部绑定到某种默认提供程序,然后你可以使用Modules.override()
或if
循环中的一个块来破解:
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);
}
}
}
如果这对您的口味来说太复杂了,请记住,您始终可以注入一个单一方法对象的实例,该实例Properties
为您包装访问权限,并在需要时计算默认值。