14

我对 Guice 的理解是:

  • 构造函数级注入 ( @Inject public class Widget(Dep one, Dep two))意味着Guice 总是会在每次通过Injector;调用构造函数时注入该构造函数。和
  • 方法级注入@Inject public void setDepOne(Dep one)_WidgetInjector

这两个假设是否正确?如果不是,请澄清!

所以我挂断的是:场级注入的含义是什么?

@Inject private Dep one;

这是否意味着在通过 Guice 注入器创建对象时,Guice 将始终注入属性?在那种情况下,我会想象它与构造函数级注入冲突。

例如,以下是否会导致冲突/错误:

public class Widget {
    @Inject private Dep one;

    private Dep two;

    // Dep one already injected as a field!
    @Inject public Widget(Dep one, Dep two) {
        // ...
    }
}

提前致谢!

4

2 回答 2

24

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 代码示例时减少冗长之外,我并不经常发现字段注入的用途。在生产代码中这是不明智的,因为它使代码难以测试。

于 2012-04-15T03:11:14.710 回答
1

你的假设是正确的。我相信在这种特殊情况下,Guice 将注入one两次——一次通过构造函数,一次通过字段——如果没有别的,因为它无法知道它们将进入同一个字段。

于 2012-04-13T14:35:40.097 回答