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

时间:2014-06-20 23:12:37

标签: java constructor dependency-injection guice

以下是一些代码:

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>

2 个答案:

答案 0 :(得分:5)

默认情况下,Guice会实例化任何具有

的对象
  • @ Inject标记的非私有构造函数
  • 非私有的无参数构造函数
  • 默认构造函数(无构造函数)

因为String有一个no-args公共构造函数,所以new String()将创建一个等同于""的字符串

这是确定性行为,并且会在具有上述条件的任何类型中发生。如果你担心它,你可以做

binder().requireAtInjectOnConstructors()

然后Guice会报告一个缺失的绑定。此外,还计划进行未来的增强,以防止java.lang。*类型在没有限定符/绑定注释的情况下被绑定。这也会阻止像String或Integer这样的核心类型自动绑定“”或0,因为有人注入了它们。

答案 1 :(得分:-1)

docs提及

@Inject(optional=true)

这将使guice能够使用默认值。

“混合可选注入和即时绑定可能会产生令人惊讶的结果。例如,即使未明确绑定Date,也始终注入以下字段。这是因为Date具有符合条件的公共无参数构造函数用于即时绑定。“

字符串的行为可能与文档示例中的Date一样,它只是调用默认的无参数构造函数。