我的用例是:
对象请求对特定类型进行未绑定的@Named注入。我希望Guice告诉我的'后备'提供程序名称值是什么(或者给我整个注释)所以我的提供者仍然可以提供基于名称值的实现。
因此,@ Named值用作在运行时查找正确实现的键。如果基于@Named找到 的实现,则不应咨询提供者。
答案 0 :(得分:1)
Guice基本上是从(注释,类型)元组到Provider<T>
的映射。没有办法将默认绑定绑定到所有未绑定的@Named
实例,而不是将整个范围的双精度绑定到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
访问权限的单方法对象实例,并在需要时计算默认值。