如何为Google Guice中的特定类型分配默认的“后备”提供程序

时间:2013-01-19 15:59:19

标签: java guice

我的用例是:

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

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

1 个答案:

答案 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访问权限的单方法对象实例,并在需要时计算默认值。