【问题标题】:Guice: implications of field injectionGuice:现场注入的影响
【发布时间】:2012-04-13 14:32:35
【问题描述】:

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

这是否意味着当通过 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) {
        // ...
    }
}

提前致谢!

【问题讨论】:

    标签: java dependency-injection guice


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

    【讨论】:

    • Guice 将始终为它注入的每个依赖项创建一个新实例,除非它找到其他一些绑定,例如单例。
    • 在这种情况下,注入的字段是私有的,这使得如果不使用反射之类的东西就很难访问它们。
    • 您能否提供指向解释此问题的 office doc 的链接?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 2017-05-28
      • 2016-09-04
      相关资源
      最近更新 更多