Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring注射依赖_Spring_Spring Mvc - Fatal编程技术网

Spring注射依赖

Spring注射依赖,spring,spring-mvc,Spring,Spring Mvc,我正在用春季食谱学习春季。到目前为止,我了解到我们可以使用Setter注入或通过构造函数注入依赖项。我的问题是,在现实世界的应用中,什么方法更常用,为什么?我知道这是一个主观的问题,但我想不出比这个网站更好的地方来获得完美的见解。再次感谢。构造函数注入被认为比setter注入更好,因为构造函数注入确保满足所有必需属性,并且不可能实例化处于无效状态的对象。请看这篇文章的例子:我更喜欢自己。自2005年以来我一直在使用Spring。构造函数注入比setter注入更可取,因为它清楚地定义了所需的依赖项

我正在用春季食谱学习春季。到目前为止,我了解到我们可以使用Setter注入或通过构造函数注入依赖项。我的问题是,在现实世界的应用中,什么方法更常用,为什么?我知道这是一个主观的问题,但我想不出比这个网站更好的地方来获得完美的见解。再次感谢。

构造函数注入被认为比setter注入更好,因为构造函数注入确保满足所有必需属性,并且不可能实例化处于无效状态的对象。请看这篇文章的例子:

我更喜欢自己。自2005年以来我一直在使用Spring。

构造函数注入比setter注入更可取,因为它清楚地定义了所需的依赖项,并强制您在创建类实例之前提供它们。使用setter注入,调用者必须弄清楚需要哪些依赖项,并且可能导致调用者无法注入所有必要的依赖项

但是,在某些情况下,您需要使用setter注入,例如处理只有默认构造函数的对象,或者设置可能存在双向关系的依赖项


当有疑问时,尝试使用构造函数注入,只有在需要时才使用setter。

其他答案已经非常清楚了,因为构造函数注入更节省,忘记设置字段如果没有字段,就不能创建实例。因此,来自该语句的一个建议是:对必填字段使用构造函数注入,对可选字段使用setter或字段注入

施工人员注入还有两个其他影响:

  • 字段可以是
    final
    -(我喜欢final字段,因为这样更容易理解)
  • 不能构建类的循环。(A.b和b.A)-Spring无法实例化此构造。(*从架构的角度来看,我认为这是构造函数注入的优点,而不是缺点)
但另一方面,如果使用构造函数注入,则必须编写比需要更多的代码

public class FieldInjection {
  @Ressource //the same like @Autowired(required=true)
  private MyService myService;
}
它比:

public class MethodInjection {      
  private final MyService myService;

  public MethodInjection(final MyService myService) {
     assert(myService != null);
     this.myService = myService;
  }
}
其他答案的作者会因为那句话而恨我


我个人认为,当你有一个类,它只被用作Springbean(但不是没有Spring),那么你就可以使用field Injection,而不必担心安全问题因为Spring只有在能够设置由
@Ressource
@Autowired(required=true)
注释的所有字段时,才会将Bean放入其生命周期。正因为如此,我更喜欢场注入,因为它使我的速度更快(写的更少,读的更少)。对于所有初始化内容,我使用
@PostConstruct
。(当然,你不能使用构造函数中的字段。你也不能真正混合使用它们。)-这使我的应用程序与IOC容器的联系比构造函数injetion更紧密,但这对我的用例来说不是问题请看一下EJB3.1标准,它们根本没有构造函数注入

每种方法都有利弊。我认为,基于构造函数的依赖项注入不太容易出错,因为您正在强加某些规则,并告诉您的类它的方法需要哪些依赖项。更重要的是,构造函数注入强制执行初始化顺序并防止循环依赖。对于setter注入,不清楚需要实例化的顺序以及何时完成连接


另一方面,二传手的射门获胜也是有原因的。如果构造器很简单,而且做得少,或者什么都不做,那么单元测试总是比较容易。此外,并非一个类的所有方法都需要相同的依赖项。如果您使用Spring容器来注入依赖项,那么您不必总是担心这一点,因为如果您正确配置Spring容器,它将自动为您调用setter

这个数字是3。方法:您可以直接注入字段。额外的好处是,您注入的对象可以是
final
,如果它们是构造函数注入的。