Guice:野外注射的含义

IAm*_*aja 13 java dependency-injection guice

我对Guice的理解是:

  • 构造函数级注入(@Inject public class Widget(Dep one, Dep two))意味着 Guice每次通过一个调用时都会注入该构造函数Injector; 和
  • 方法级注入(@Inject public void setDepOne(Dep one))意味着 Guice将始终在调用该方法时注入该方法,只要该Widget对象是使用Guice创建的Injector

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

所以我所依赖的是:现场注入的含义什么?

@Inject private Dep one;
Run Code Online (Sandbox Code Playgroud)

这是否意味着当通过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) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Rya*_*son 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();

    }
}
Run Code Online (Sandbox Code Playgroud)

运行时,这将生成如下内容:

com.example.Dep@63238bd2
com.example.Dep@69198891
Run Code Online (Sandbox Code Playgroud)

显然有两个不同的对象.第一行是构造函数; 第二是现场注入.

除了在编写Guice代码示例时减少冗长,我还没有经常找到用于场注入的用法.在生产代码中,它是不明智的,因为它使代码难以测试.


Lou*_*man 1

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