[英]Guice Constructor injection or Field injection?
我是 Guice 的新手。 首选构造函数注入还是首选字段注入?
字段注入看起来既快速又简单,但由于缺少构造函数,测试将是一个挑战。
谢谢。
在他们的Minimize mutability wiki 页面上,Guice 团队说:
最小化可变性
在可能的情况下,使用构造函数注入来创建不可变对象。 不可变对象简单、可共享且可以组合。 按照此模式定义可注入类型:
[...]
注入方法和字段
构造函数注入有一些限制:
- 注入的构造函数可能不是可选的。
- 除非对象是由 Guice 创建的,否则不能使用它。 这是某些框架的破坏者。
- 子类必须使用所有依赖项调用
super()
。 这使得构造函数注入变得麻烦,尤其是当注入的基类发生变化时。当您需要初始化一个不是由 Guice 构造的实例时,方法注入最有用。 AssistedInject 和 Multibinder 等扩展使用方法注入来初始化绑定对象。
字段注入具有最紧凑的语法,因此它经常出现在幻灯片和示例中。 它既不是封装的,也不是可测试的。 永远不要注入 final 字段; JVM 不保证注入的值对所有线程都是可见的。
想指出一些差异,以便您自己决定:
final
修饰符。 不能用场注入做到这一点。 final
成员的优势是题外话,您可以阅读相关内容。 以上只是需要思考的几点。 我个人更喜欢构造函数注入,因为它易于测试和final
支持。
这两种类型都很好。 但是您需要知道何时何地需要使用构造函数注入。
构造函数注入的优点是,
In Constructor Injection you can use something like this.
public class MemberResource {
private final IMemberService memberService;
@Inject
public MemberResource(IMemberService memberService) {
this.memberService = memberService;
}
}
字段注入的优点是更少的编码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.