构造函数注入与现场注入

2022-09-01 20:59:54

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

现场注入:

 @Inject 
 private MyService myService;

构造函数注入:

private MyService myService; 

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

为什么构造函数注入现场注入更好?


答案 1

我在现场注射中只发现了两个缺点。

  • 当对象被测试时,很难注入模拟。(可以从Mockito解决)@InjectMocks

  • 循环依赖关系。如果豆子依赖于豆子,而豆子需要豆子。如果你有构造函数注入,很容易找到它。ABBA


答案 2

做这样的事情(我假设你正在使用弹簧靴或类似你的CDI的东西)

public class ClassWhereIWantToInject{

    private MyService myService; 

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

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


推荐