以下是一些代码:
public class InjectedClass{
private final Dependency dependency;
private final String string;
@Inject
public InjectedClass(Dependency dependency, String string){
this.dependency=dependency;
this.string=string;
}
}
让我们说我已经将我的依赖项绑定在我的模块中,但是我没有对String进行任何绑定。 Guice如何/如何选择成为String参数的默认值?在我的(更复杂的)测试用例中,它似乎是将它设置为&#34;&#34;,但是如何做到这一点的逻辑对我来说并不明显,我不知道这是否是确定性行为。< / p>
答案 0 :(得分:5)
默认情况下,Guice会实例化任何具有
的对象因为String有一个no-args公共构造函数,所以new String()将创建一个等同于""
的字符串
这是确定性行为,并且会在具有上述条件的任何类型中发生。如果你担心它,你可以做
binder().requireAtInjectOnConstructors()
然后Guice会报告一个缺失的绑定。此外,还计划进行未来的增强,以防止java.lang。*类型在没有限定符/绑定注释的情况下被绑定。这也会阻止像String或Integer这样的核心类型自动绑定“”或0,因为有人注入了它们。
答案 1 :(得分:-1)
docs提及
@Inject(optional=true)
这将使guice能够使用默认值。
“混合可选注入和即时绑定可能会产生令人惊讶的结果。例如,即使未明确绑定Date,也始终注入以下字段。这是因为Date具有符合条件的公共无参数构造函数用于即时绑定。“
字符串的行为可能与文档示例中的Date一样,它只是调用默认的无参数构造函数。