Guice 中的可选注入
Optional injection in Guice
是否可以告诉 Guice 不必注入所有构造函数参数?例如,我有一个构造函数 Foo
,它接受两个类型为 Bar
和 Baz
的参数。在我的系统中它们都是可选的:它们可能
- 都在场
- 都不见了
- 只有
Bar
存在
- 只有
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)
方法效果更好,并且还添加了一些高级功能。
是否可以告诉 Guice 不必注入所有构造函数参数?例如,我有一个构造函数 Foo
,它接受两个类型为 Bar
和 Baz
的参数。在我的系统中它们都是可选的:它们可能
- 都在场
- 都不见了
- 只有
Bar
存在 - 只有
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)
方法效果更好,并且还添加了一些高级功能。