Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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
Java 基于属性或基于构造函数的依赖项注入_Java_Spring_Inversion Of Control - Fatal编程技术网

Java 基于属性或基于构造函数的依赖项注入

Java 基于属性或基于构造函数的依赖项注入,java,spring,inversion-of-control,Java,Spring,Inversion Of Control,我刚开始学习Spring,我有一个问题: 为了注入bean,何时最好使用基于属性的依赖项注入: <bean id="myFirstClass" class="..."> <property name="targetProperty"> <bean id="TheBeanIwantToInject" class="..."/> </property> </bean> 而不是基于构造函数的依赖项注入 <be

我刚开始学习Spring,我有一个问题:

为了注入bean,何时最好使用基于属性的依赖项注入:

 <bean id="myFirstClass" class="...">
  <property name="targetProperty">
     <bean id="TheBeanIwantToInject" class="..."/>
  </property>
 </bean>

而不是基于构造函数的依赖项注入

<bean id="myFirstClass" class="...">
  <constructor-arg ref="TheBeanIwantToInject"/>
</bean>


或者它只是两个等价的解决方案?

如果要创建不可变对象,那么构造函数arg变量是唯一的选项。我更喜欢那个。

如果您有双向依赖项,则需要对其中一个进行属性注入。通常情况下,如果你有这样的情况,你应该考虑一下你的架构。可以在一个新类中提取相互依赖关系,例如

您需要诚实地查看您在代码中所做的事情以及什么是有意义的。从纯面向对象的角度来看,如果您的类需要依赖项才能工作,并且它永远不应该被更改,那么可以使用构造函数注入。如果您需要一个默认依赖项,但它可能会更改(或可选),请使用属性

然而,这是一个圣战式的问题。我应该使用XML还是Autowire,应该通过属性或构造函数进行注入。真正的关键是保持一致。如果您是一致的,那么对于下一个必须在您的代码中工作的可怜的开发人员来说,这是有意义的,即使根据OO原则,它在技术上是不正确的。如果你前后矛盾,我为下一个家伙感到抱歉


我的偏好是尽可能多地使用构造函数注入(constructor injection),它允许我拥有更干净的代码,而不需要所有可能破坏封装逻辑的getter和setter。

嗯,这并不完全正确。使用Java配置,您可以自动连接私有字段。@NilsH甚至是最终字段?如果是这样的话,我同意并将删除我的答案。@NilsH您不需要使用Java配置自动连接私有字段,也可以通过“classic”xml配置完成。不,这将导致编译错误(因为它未初始化)。春天对此无能为力。然而,声明一个字段final并不能真正成为或不是一个不可变的对象。不过,我同意你的回答。我也喜欢。但这涉及到很多个人偏好。我更喜欢构造函数注入,因为如果我不想,它不会强迫我向对象添加setter。这是一种宗教。。。你想做什么就做什么。