我对 Guice 的理解是:
- 构造函数级注入(inject) (
@Inject public class Widget(Dep one, Dep two)
) 暗示 每次通过Injector
调用时,Guice 总是注入(inject)该构造函数;和 - 方法级注入(inject) (
@Inject public void setDepOne(Dep one)
) 暗示只要Widget
被调用,Guice 总是会注入(inject)该方法。对象是使用 Guice 创建的Injector
这两个假设是否正确?如果不是,请澄清!
所以我挂断的是:字段级注入(inject)的含义是什么?
@Inject private Dep one;
这是否意味着当通过 Guice 注入(inject)器创建对象时,Guice 将始终注入(inject)该属性?在那种情况下,我认为它与构造函数级注入(inject)冲突。
例如,以下是否会导致冲突/错误:
public class Widget {
@Inject private Dep one;
private Dep two;
// Dep one already injected as a field!
@Inject public Widget(Dep one, Dep two) {
// ...
}
}
提前致谢!
最佳答案
Guice 将始终注入(inject)所有字段、方法和任何用 @Inject
注释的构造函数。请记住,构造函数总是首先被注入(inject),因此您的注释字段实际上将覆盖该注入(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
显然是两个不同的对象。第一行是构造函数;二是场注入(inject)。
除了在编写 Guice 代码示例时减少冗长之外,我并不经常发现字段注入(inject)的用途。在生产代码中,这是不明智的,因为它使代码难以测试。
关于java - Guice:场注入(inject)的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10142791/