java - Guice:场注入(inject)的影响

标签 java dependency-injection guice

我对 Guice 的理解是:

  • 构造函数级注入(inject) ( @Inject public class Widget(Dep one, Dep two) ) 暗示 每次通过 Injector 调用时,Guice 总是注入(inject)该构造函数;和
  • 方法级注入(inject) ( @Inject public void setDepOne(Dep one) ) 暗示只要 Widget 被调用,Guice 总是会注入(inject)该方法。对象是使用 Guice 创建的 Injector

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

所以我挂断的是:字段级注入(inject)的含义是什么?

@Inject private Dep one;

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

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

public class Widget {
    @Inject private Dep one;

    private Dep two;

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

提前致谢!

最佳答案

Guice 将始终注入(inject)所有字段、方法和任何用 @Inject 注释的构造函数。请记住,构造函数总是首先被注入(inject),因此您的注释字段实际上将覆盖该注入(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

显然是两个不同的对象。第一行是构造函数;二是场注入(inject)。

除了在编写 Guice 代码示例时减少冗长之外,我并不经常发现字段注入(inject)的用途。在生产代码中,这是不明智的,因为它使代码难以测试。

关于java - Guice:场注入(inject)的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10142791/

相关文章:

c# - 获取 Simple Injector 的容器实例

java - 在不绑定(bind) Guice 的情况下

java - JCR在运行时查找强制属性

java - com.fasterxml.jackson.databind.exc.MismatchedInputException : Cannot deserialize instance of Object out of START_ARRAY token

java - 高并发时Servlet问题

clojure - 与 google guice 相当的 clojure 是什么?

dependency-injection - Guice + Jersey : custom serialization of entities

java - 传递对象或对象属性

c# - Specflow - 使用来自 .NET Core 的 Microsoft 依赖注入(inject)导致 BoDi.ObjectContainerException

c# - 注入(inject) InSingletonScope 的对象是否也可以注入(inject)到其他地方的多重绑定(bind)中?