引导String依赖(或其他未绑定原语)的构造函数注入



代码如下:

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相同,它只是调用默认的无参数构造函数。

最新更新