为了账号安全,请及时绑定邮箱和手机立即绑定

Guice 构造函数注入或字段注入?

Guice 构造函数注入或字段注入?

波斯汪 2021-10-13 15:55:16
我是 Guice 的新手。首选构造函数注入还是首选字段注入?字段注入看起来既快速又简单,但由于缺少构造函数,测试将是一个挑战。谢谢。
查看完整描述

3 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

使用构造函数注入

在他们的Minimize mutability wiki 页面上,Guice 团队说:

最小化可变性

在可能的情况下,使用构造函数注入来创建不可变对象。不可变对象简单、可共享且可以组合。按照此模式定义可注入类型:

[...]

注入方法和字段

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

  • 注入的构造函数可能不是可选的。

  • 除非对象是由 Guice 创建的,否则不能使用它。这是某些框架的破坏者。

  • 子类必须调用super()所有依赖项。这使得构造函数注入变得麻烦,尤其是当注入的基类发生变化时。

当您需要初始化一个不是由 Guice 构造的实例时,方法注入最有用。AssistedInject 和 Multibinder 等扩展使用方法注入来初始化绑定对象。

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


查看完整回答
反对 回复 2021-10-13
?
LEATH

TA贡献1936条经验 获得超6个赞

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

  • 通过构造函数注入,您可以使用final修饰符。不能用场注入做到这一点。final会员的优势是题外话,您可以阅读相关内容。

  • 使用构造函数注入编写测试用例很容易(就像您已经提到的那样)

  • 使用构造函数注入,所有依赖项都是强制性的。为了声明一个类,您需要知道它所有必需的依赖项。

  • 使用字段注入,您将隐藏类的依赖项,而不是使它们显式。

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


查看完整回答
反对 回复 2021-10-13
?
慕仙森

TA贡献1827条经验 获得超7个赞

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


构造函数注入的优点是,


它提供了不变性(如果使用得当)

In Constructor Injection you can use something like this.


public class MemberResource {


     private final IMemberService memberService;


     @Inject

     public MemberResource(IMemberService memberService) {

         this.memberService = memberService;

     }


}


单元测试变得更容易。

字段注入的优点是更少的编码。


查看完整回答
反对 回复 2021-10-13
  • 3 回答
  • 0 关注
  • 211 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信