Guice 中的可选注入

Optional injection in Guice

是否可以告诉 Guice 不必注入所有构造函数参数?例如,我有一个构造函数 Foo,它接受两个类型为 BarBaz 的参数。在我的系统中它们都是可选的:它们可能

  1. 都在场
  2. 都不见了
  3. 只有Bar存在
  4. 只有 Baz 存在。

也就是说,这取决于提供这些绑定的其他模块。我想得到这样的东西:

class Foo {
  private final Bar bar;
  private final Baz baz;

  @Inject(optional = true)
  public Foo(@Nullable Bar bar, @Nullable Baz baz) {
    this.bar = bar;
    this.baz = baz;
  }
}

但我不能真正将 optional 与构造函数一起使用。有办法吗?

我认为 preferred Guice pattern 是:

public class HolderPatter {

  static class Bar {
    @Inject Bar(BarDependency dependency) {}
  }
  static class Baz {
    @Inject Baz(BazDependency dependency) {}
  }

  static class BarHolder {
    @Inject(optional=true) Bar value = null;
  }

  static class BazHolder {
    @Inject(optional=true) Baz value = null;
  }

  static class Foo {
    private final Bar bar;
    private final Baz baz;

    @Inject
    public Foo(BarHolder bar, BazHolder baz) {
      this.bar = bar.value;
      this.baz = baz.value;
    }
  }
}

请注意,这还允许您指定合理的默认值...

Guice 的最新版本最近添加了 OptionalBinder,它比 @Inject(optional=true) 方法效果更好,并且还添加了一些高级功能。

另见 thread where OptionalBinder was announced