Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Guice构造函数注入还是字段注入?_Java_Guice - Fatal编程技术网

Java Guice构造函数注入还是字段注入?

Java Guice构造函数注入还是字段注入?,java,guice,Java,Guice,我对Guice不熟悉。施工人员注入优先还是现场注入优先 现场注入看起来既快又简单,但由于缺少构造函数,测试将是一个挑战 谢谢。想指出一些不同之处,以便您自己做出决定: 通过构造函数注入,您可以使用final修饰符。现场注射不能做到这一点。final成员的优点是离题的,您可以仔细阅读 使用构造函数注入编写测试用例很容易(正如您已经提到的) 对于构造函数注入,所有依赖项都是必需的。为了声明一个类,您需要知道它所需的所有依赖项 使用字段注入,您将隐藏类的依赖项,而不是使它们显式 以上只是需要考虑的

我对Guice不熟悉。施工人员注入优先还是现场注入优先

现场注入看起来既快又简单,但由于缺少构造函数,测试将是一个挑战


谢谢。

想指出一些不同之处,以便您自己做出决定:

  • 通过构造函数注入,您可以使用
    final
    修饰符。现场注射不能做到这一点。
    final
    成员的优点是离题的,您可以仔细阅读
  • 使用构造函数注入编写测试用例很容易(正如您已经提到的)
  • 对于构造函数注入,所有依赖项都是必需的。为了声明一个类,您需要知道它所需的所有依赖项
  • 使用字段注入,您将隐藏类的依赖项,而不是使它们显式
以上只是需要考虑的几点。我个人更喜欢构造函数注入,因为它易于测试和
final
支持。

使用构造函数注入 在他们的报告中,Guice团队表示:

最小化可变性 尽可能使用构造函数注入来创建不可变对象。不可变对象简单、可共享,并且可以组合。按照此模式定义可注入类型:

[……]

注入方法和注入场 构造函数注入有一些限制:

  • 注入构造函数可能不是可选的
  • 除非由Guice创建对象,否则不能使用它。这是某些框架的交易破坏者
  • 子类必须使用所有依赖项调用
    super()
    。这使得构造函数注入非常麻烦,特别是当注入的基类发生变化时
当您需要初始化不是由Guice构造的实例时,方法注入是最有用的。像AssistedInject和Multibinder这样的扩展使用方法注入来初始化绑定对象

字段注入具有最紧凑的语法,因此它经常出现在幻灯片和示例中。它既不封装也不可测试。永远不要注入最后的字段;JVM不能保证注入的值对所有线程都可见


这两种类型都很好。但您需要知道何时何地需要使用构造函数注入

构造函数注入的优点是

  • 它提供了不变性(如果使用得当)
  • 单元测试变得更容易了
    字段注入的优点是编码更少。

    当我使用word with Guice时,我只有构造函数注入。通常不建议使用字段注入。有关基本原理,请参见。尽管它是关于Spring的,但它也适用于其他依赖注入框架,包括Guice。
    In Constructor Injection you can use something like this.
    
    public class MemberResource {
    
         private final IMemberService memberService;
    
         @Inject
         public MemberResource(IMemberService memberService) {
             this.memberService = memberService;
         }
    
    }