因此,由于我一直在使用 Spring,如果我要编写一个具有依赖项的服务,我将执行以下操作:
@Component
public class SomeService {
@Autowired private SomeOtherService someOtherService;
}
我现在遇到了使用另一个约定来实现相同目标的代码
@Component
public class SomeService {
private final SomeOtherService someOtherService;
@Autowired
public SomeService(SomeOtherService someOtherService){
this.someOtherService = someOtherService;
}
}
这两种方法都有效,我明白。但是使用选项 B 有什么优势吗?对我来说,它在类和单元测试中创建了更多代码。 (必须编写构造函数并且无法使用@InjectMocks)
我有什么遗漏的吗?除了向单元测试添加代码之外,自动装配构造函数还有其他作用吗?这是进行依赖项注入的更优选方法吗?
是的,实际上比字段注入更推荐选项 B(称为构造函数注入),并且有几个优点:
- 依赖性被明确识别。在测试或在任何其他情况下实例化对象时(例如在配置类中显式创建 bean 实例),都无法忘记一个对象
- 依赖关系可以是最终的,这有助于增强鲁棒性和线程安全性
- 您不需要反射来设置依赖项。 InjectMocks 仍然可用,但不是必需的。您可以自己创建模拟并通过简单地调用构造函数来注入它们
See 这篇博文 http://olivergierke.de/2013/11/why-field-injection-is-evil/有关 Spring 贡献者之一撰写的更详细的文章,奥利维尔·吉尔克 https://stackoverflow.com/users/18122/oliver-gierke.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)