代码如下:
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参数的默认值?在我的(更复杂的)测试用例中,它似乎将其设置为",但是它如何做到这一点的逻辑对我来说并不明显,我不知道这是否是确定性行为。
默认情况下,Guice将实例化任何具有
的对象- 一个@ inject标记的非私有构造函数
- 一个非私有的无参数构造函数
- 默认构造函数(没有构造函数)
因为String有一个无参数的公共构造函数,所以new String()将创建一个等价于""
的字符串
这是一种确定性行为,对于具有上述条件的任何类型都会发生。如果你关心它,你可以做
binder().requireAtInjectOnConstructors()
则Guice将简单地报告丢失的绑定。此外,还计划在未来进行增强,以防止java.lang。*类型在没有限定符/绑定注释的情况下被绑定。这也可以防止核心类型(如String或Integer)仅仅因为有人注入它们而自动绑定"或0。
文档中提到
@Inject(optional=true)
允许向导使用默认值。
"混合可选注入和即时绑定可能会产生令人惊讶的结果。例如,即使没有显式绑定Date,也总是注入以下字段。这是因为Date有一个公共的无参数构造函数,它符合即时绑定的条件。"
字符串的行为可能与文档示例中的Date相同,它只是调用默认的无参数构造函数。