注入任何服务时,我有两个选择:
(现场注射)
@Inject
private MyService myService;
或(构造函数注入)
private MyService myService;
@Inject
public ClassWhereIWantToInject(MyService mySerivce){
this.myService = myService;
}
为什么Constructor注射比Filed注射更好?
做一些事情(我假设你使用弹簧靴或类似的CDI)
public class ClassWhereIWantToInject{
private MyService myService;
@Inject
public ClassWhereIWantToInject(MyService mySerivce){
this.myService = myService;
}
}
在这个相关的question,有一些有效的论据,为什么通过构造函数而不是通过字段注入来使用注入。它归结为可以在非CDI环境(即单元测试)中通过构造函数使用初始化的优点,而无需添加更复杂的逻辑。
我发现现场注射只有两个缺点。
@InjectMocks
解决)A
依赖于豆B
和豆B
需要豆A
。如果你有构造函数注入,很容易找到它。如果包含这个注入的类将由框架注入(spring / ejb / cdi),则将正确执行字段注入,否则(该类将由调用者使用new运算符实例化)它实际上是等待发生的NullPointerException。在这种情况下,最好使用构造函数注入。
当注入将由框架注入的类中进行时,我们可以执行可靠的现场注入。