Guice:野外注射的含义

时间:2012-04-13 14:32:36

标签: java dependency-injection guice

我对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;

提前致谢!

2 个答案:

答案 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>