我刚开始学习Spring,我有一个问题:
为了注入bean,何时使用基于属性的依赖注入更好:
<bean id="myFirstClass" class="...">
<property name="targetProperty">
<bean id="TheBeanIwantToInject" class="..."/>
</property>
</bean>
而不是基于构造函数的依赖注入
<bean id="myFirstClass" class="...">
<constructor-arg ref="TheBeanIwantToInject"/>
</bean>
或者它只是两个等效的解决方案?
答案 0 :(得分:4)
如果要创建不可变对象,则构造函数arg变量是唯一的选项。我更喜欢那个。
答案 1 :(得分:2)
如果您有双向依赖关系,则需要将其中一个属性注入。通常,如果你有这种情况,你应该考虑你的架构。可以在新类中提取相互依赖性,例如
答案 2 :(得分:1)
你需要诚实地看看你在代码中做了什么以及有什么意义。从纯OO的角度来看,如果您需要让类的依赖项工作并且永远不应该更改它,请使用构造函数注入。如果您需要默认依赖项但它可能会更改(或可选的依赖项),请使用属性。
然而,这是一个神圣的战争类型的问题。我应该使用XML还是Autowire,我应该通过属性或构造函数注入。真正的关键是一致的。如果你是一致的,那么即使根据OO原则在技术上不正确,下一个必须在你的代码中工作的可怜的开发人员也会有意义。如果你不一致,我为下一个人感到难过。
我的偏好,并不重要,是尽可能多地使用构造函数注入,它允许我拥有更清晰的代码,而没有可能破坏封装逻辑的所有getter和setter。