注入任何服务时,我有两个选择:
(现场注射)
@Inject
private MyService myService;
或(构造函数注入)
private MyService myService;
@Inject
public ClassWhereIWantToInject(MyService mySerivce){
this.myService = myService;
}
为什么构造函数注入优于Filed注入?
答案 0 :(得分:4)
执行类似的操作(我假设您使用的是弹簧启动或类似于CDI的东西)
public class ClassWhereIWantToInject{
private MyService myService;
@Inject
public ClassWhereIWantToInject(MyService mySerivce){
this.myService = myService;
}
}
在这个相关的question,有一些有效的论据,为什么通过构造函数而不是通过字段注入来使用注入。它归结为可以在非CDI环境(即单元测试)中通过构造函数使用初始化,而无需添加更复杂的逻辑。
答案 1 :(得分:2)
我发现在野外注入中只有两个缺点。
在测试对象时很难注入模拟。 (可以使用Mockito的@InjectMocks
来解决)
圈子依赖关系。如果bean A
依赖于bean B
,而bean B
需要bean A
。如果您有构造函数注入,则很容易找到它。
答案 2 :(得分:0)
如果包含此注入的类将由框架(spring / ejb / cdi)注入,则将正确执行字段注入,否则(该类将由调用者使用new运算符实例化)它是否正确执行真的是一个等待发生的NullPointerException。在这种情况下,最好使用构造函数注入。
当注射将在框架注入的类中进行时,我们可以执行可靠的场注入。
答案 3 :(得分:0)
通过阅读这篇出色的文章(https://blog.marcnuri.com/field-injection-is-not-recommended/),我们可以找到关于为什么 Field Injection 不是一个好选择的更好解释。
不允许我们使用 final 关键字将字段设置为不变。
与 SRP (单一职责原则)相比,这又迈出了一步,一旦拥有此字段的Class开始对第三方广告的初始化时间负责派对班。