2016-11-22 70 views
5

当注入的任何服务,我有两个选择:构造函数注入VS字段注入

(字段注入)

@Inject 
    private MyService myService; 

或(构造函数注入)

private MyService myService; 

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

为什么构造方法注入是较好比归档注射?

+0

什么是这个错误的声纳描述? – Chris311

+2

查看相关规则描述([this one](https://sonarqube.com/coding_rules#rule_key=squid%3AS3306))。然后我建议你更新你的问题,如果有些事情还不清楚的话,就可以通过对实际描述的查询来更新。 –

+0

非常感谢@Nicolas – Riadh

回答

1

做这样的事情(我假设你正在使用的弹簧引导或您的CDI东西可比)

public class ClassWhereIWantToInject{ 

    private MyService myService; 

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

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

+1

我正在使用EJB-CDI。问题是哪个注射最好:Field或者构造函数?答案是[这里](https://sonarqube.com/coding_rules#rule_key=squid%3AS3306) – Riadh

+1

哈哈,很好,我应该在打字之前查看关于你问题的评论。我以为你想避免这个警告,这就是为什么我添加了这段代码。 – hecko84

0

答案是here

字段注入将被正确地执行,如果包含此注入将由框架(弹簧/ EJB/CDI)被注入,否则类(类将由呼叫者使用实例化的新的操作符),这真的是一个NullPointerException等待发生。在这种情况下,最好使用构造函数注入。

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