java - 什么是场注入如何避免它?

  显示原文与译文双语对照的内容
79 3

我在一些关于 Spring MVCPortlets的帖子中阅读了不推荐的。因为我想得到答案,我问自己是否正在使用现场注射,我无法回答。在理解字段注入时,如果你将一个 Bean 注入到具有这样的@Autowired的属性中,则为:

CartController.java:

...
@Autowired
private Cart cart;
...

BookshopConfiguartion.java:

@Configuration
public class BookShopConfiguration {
@Bean
public Cart cart(){
 return new Cart();
}
//more configuration

我的Cart.java 用于存储和提供关于购物车中的书籍的信息。

在我的研究中,我阅读了关于构造函数注入:

MyComponent.java:

...
public class MyComponent{
private Cart cart;
@Autowired
public MyComponent(Cart cart){
 this.cart = cart;
}
...

这两种注射剂的优点和缺点是什么?

如果这个问题被标记为的副本,编辑 1: 这个问题我检查过了。因为问题中没有任何代码示例,也不在答案中,如果我是正确的,我的猜测是否正确。

时间:原作者:0个回答

148 0

注射类型

如何将依赖项注入到bean中,有三个选项:

  • 通过构造函数
  • 通过setter或者其他方法
  • 通过反射直接进入领域

你正在使用选项 3 。这就是在你的领域直接使用 @Autowired 时发生的事情。

注射准则

下面是一个通用指南,是由 spring ( 请参阅基于构造器的节,或者基于或者setter的DI 。) 推荐的:

  • 对于强制依赖关系或者针对不可变性的目标,请使用构造函数注入
  • 对于可选或者可变的依赖项,使用setter注入
  • 大多数情况下避免字段注入

字段注入缺陷

字段注入被忽略的原因如下:

  • 不能创建不可变的对象,就像在构造函数注入中一样
  • 类与DI容器紧密耦合,不能在它的外部使用
  • 你的类不能在没有反射的情况下实例化。要实例化DI容器,这使得你的测试更像是集成测试
  • 真实的依赖项从外部隐藏,不反映在接口中( 构造函数或者方法)
  • 它很容易拥有十个依赖项。如果你使用的是构造函数注入,你将有一个具有十个参数的构造函数,这将。但你可以无限地使用字段注入添加注入字段。拥有太多的依赖项是一个红旗,该类通常不止一个事件,而且它可以能违反 单一职责原则(Single Responsibility Principle) 。

结论

你应该主要使用构造函数注入或者构造器和setter注入的一些混合,具体取决于你的需求。场注入有许多缺点,应避免。现场注射的唯一优点是,写作更方便,而不是所有的缺点。

阅读

我写了一篇博客文章,介绍为什么通常不推荐使用字段注入:字段依赖注入考虑有害的问题。

原作者:
142 5

这是软件开发中永远不会结束的讨论之一,但业界主要负责人对主题进行了更好的选择。

构造函数注入

优势:

  • 可以在单元测试中不需要任何mock库或者 spring 上下文。你可以创建一个对象,该对象要用新的关键字测试。这样的测试总是更快,因为它们不依赖于反射机制。( 这个问题在分钟后被问到。如果作者已经使用构造函数注入,它将不会出现。
  • 如果依赖项设置为 ,则不能更改。
  • 在执行构造函数之后,你的对象准备使用任何作为参数传递的东西,这是安全的。对象可以是已经准备好的,也可以是不存在的。使用字段注入,当对象易碎时引入中间步骤。
  • 强制依赖关系的表达式。在这里情况下,场注入不明确。
  • 让开发者考虑设计有 8个参数的构造函数,实际上是一个坏设计和对象反对象模式的符号。类在它的构造函数或者字段中是否具有 8依赖关系并不重要,它总是错误的。人们更愿意向构造函数添加更多依赖项,而不是通过字段。它作为一个信号,你的大脑,你应该停止一段时间,思考你的代码结构。

缺点:

  • 代码 ( 但是现代的ide缓解了) 。

基本上,场注入是相反的。

原作者:
...