指导:现场注入的含义

2022-09-04 00:56:55

我对Guice的理解是:

  • 构造函数级注入 () 意味着 Guice 每次通过 ;和@Inject public class Widget(Dep one, Dep two)Injector
  • 方法级注入 () 意味着 Guice 在调用该方法时将始终注入该方法,只要对象是使用 Guice 创建的@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) {
        // ...
    }
}

提前致谢!


答案 1

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 代码示例时减少冗长。在生产代码中,这是不明智的,因为它使代码难以测试。


答案 2

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


推荐