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

时间:2013-04-28 18:57:44

标签: java spring inversion-of-control

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

你需要诚实地看看你在代码中做了什么以及有什么意义。从纯OO的角度来看,如果您需要让类的依赖项工作并且永远不应该更改它,请使用构造函数注入。如果您需要默认依赖项但它可能会更改(或可选的依赖项),请使用属性。

然而,这是一个神圣的战争类型的问题。我应该使用XML还是Autowire,我应该通过属性或构造函数注入。真正的关键是一致的。如果你是一致的,那么即使根据OO原则在技术上不正确,下一个必须在你的代码中工作的可怜的开发人员也会有意义。如果你不一致,我为下一个人感到难过。

我的偏好,并不重要,是尽可能多地使用构造函数注入,它允许我拥有更清晰的代码,而没有可能破坏封装逻辑的所有getter和setter。