构造函数注入vs场注入

问题描述 投票:8回答:3

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

(现场注射)

 @Inject 
    private MyService myService;

或(构造函数注入)

private MyService myService; 

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

为什么Constructor注射比Filed注射更好?

java dependency-injection sonarqube cdi
3个回答
4
投票

做一些事情(我假设你使用弹簧靴或类似的CDI)

public class ClassWhereIWantToInject{

    private MyService myService; 

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

在这个相关的question,有一些有效的论据,为什么通过构造函数而不是通过字段注入来使用注入。它归结为可以在非CDI环境(即单元测试)中通过构造函数使用初始化的优点,而无需添加更复杂的逻辑。


2
投票

我发现现场注射只有两个缺点。

  • 当物体在测试时难以注入嘲笑。 (可以用Mockito的@InjectMocks解决)
  • Circe依赖。如果豆A依赖于豆B和豆B需要豆A。如果你有构造函数注入,很容易找到它。

0
投票

如果包含这个注入的类将由框架注入(spring / ejb / cdi),则将正确执行字段注入,否则(该类将由调用者使用new运算符实例化)它实际上是等待发生的NullPointerException。在这种情况下,最好使用构造函数注入。

当注入将由框架注入的类中进行时,我们可以执行可靠的现场注入。

© www.soinside.com 2019 - 2024. All rights reserved.