3

我的用例是这样的:

对象请求特定类型的未绑定@Named 注入。我希望 Guice 告诉我的“后备”提供者名称值是什么(或给我整个注释),以便我的提供者仍然可以提供基于名称值的实现。

因此,@Named 值用作在运行时查找正确实现的键。如果基于@Named 找到了实现,不应咨询提供者。

4

1 回答 1

2

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为您包装访问权限,并在需要时计算默认值。

于 2013-01-22T07:37:08.290 回答