构造函数注入vs场注入

时间:2016-11-22 09:08:55

标签: java dependency-injection sonarqube cdi

注入任何服务时,我有两个选择:

(现场注射)

 @Inject 
    private MyService myService;

或(构造函数注入)

private MyService myService; 

@Inject
public ClassWhereIWantToInject(MyService mySerivce){
    this.myService = myService;
}

为什么构造函数注入优于Filed注入?

4 个答案:

答案 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开始对第三方广告的初始化时间负责派对班。

相关问题