我对Guice的理解是:
@Inject public class Widget(Dep one, Dep two)
)暗示 Guice每次通过Injector
调用时都会注入该构造函数;和@Inject public void setDepOne(Dep one)
)暗示只要Widget
对象是使用Guice创建的,Guice将始终在调用该方法时注入该方法。 {1}} 这两个假设是否正确?如果没有,请澄清!
所以我所依赖的是:现场注射的含义是什么?
Injector
这是否意味着当通过Guice注入器创建对象时,Guice将始终注入属性?在那种情况下,我会想象它与构造函数级注入冲突。
例如,以下是否会导致冲突/错误:
@Inject private Dep one;
提前致谢!
答案 0 :(得分:22)
Guice将始终注入所有字段,方法以及使用@Inject
注释的任何单个构造函数。请记住,构造函数总是首先被注入,因此您的带注释的字段实际上会覆盖该注入。拿这个修改过的例子:
class Widget {
@Inject
private Dep one;
@Inject
public Widget(Dep one) {
this.one = one;
System.out.println(one);
}
public void printDependency() {
System.out.println(one);
}
}
class Dep {}
public class MyMain {
public static void main(String[] args) {
Injector i = Guice.createInjector();
i.getInstance(Widget.class).printDependency();
}
}
运行时,会生成如下内容:
com.example.Dep@63238bd2
com.example.Dep@69198891
显然有两个不同的对象。第一行是构造函数;第二是现场注射。
除了在编写Guice代码示例时减少冗长,我还没有经常找到用于场注入的用法。在生产代码中,它是不明智的,因为它使代码难以测试。
答案 1 :(得分:1)
您的假设是正确的。我相信在这个特殊情况下,Guice将注入one
两次 - 一次通过构造函数,一次通过该字段 - 如果没有别的,因为它无法知道它们将进入同一个字段。 / p>