Guice构造器注入还是现场注入?

时间:2018-09-26 22:42:35

标签: java guice

我是Guice的新手。是首选构造函数注入还是首选字段注入?

字段注入看起来快速而简单,但是由于缺少构造函数,因此测试将是一个挑战。

谢谢。

3 个答案:

答案 0 :(得分:2)

想指出一些差异,以便您自己决定:

  • 通过注入构造函数,您可以使用final修饰符。使用场注入无法做到这一点。 final成员的优势是不合时宜的,您可以继续阅读。
  • 使用构造函数注入编写测试用例很容易(就像您已经提到的那样)
  • 使用构造函数注入时,所有依赖项都是必需的。为了声明一个类,您需要知道其所有必需的依赖项。
  • 通过字段注入,您将隐藏类的依赖关系,而不是使它们显式。

以上只是需要考虑的几点。我个人更喜欢构造函数注入,因为它易于测试并且final支持。

答案 1 :(得分:1)

使用构造函数注入

Guice团队在他们的Minimize mutability wiki page上说:

  

最小化可变性

     

尽可能使用构造函数注入来创建不可变对象。不可变对象是简单,可共享的并且可以组成。请遵循以下模式来定义您的可注射类型:

     

[...]

     

注入方法和字段

     

构造函数注入有一些限制:

     
      
  • 注入的构造函数可能不是可选的。
  •   
  • 除非由Guice创建对象,否则不能使用它。这对于某些框架来说是一个破坏者。
  •   
  • 子类必须以所有依赖项调用super()。这使构造函数注入变得麻烦,尤其是随着注入的基类的更改。
  •   
     当需要初始化非Guice构造的实例时,

方法注入最有用。诸如AssistedInject和Multibinder之类的扩展使用方法注入来初始化绑定的对象。

     

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

答案 2 :(得分:0)

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

构造函数注入的优点是

  1. 它提供不变性(如果使用正确)
In Constructor Injection you can use something like this.

public class MemberResource {

     private final IMemberService memberService;

     @Inject
     public MemberResource(IMemberService memberService) {
         this.memberService = memberService;
     }

}

  1. 单元测试变得更加容易。

场注入的优点是编码较少。