2013-04-28 74 views
2

我刚开始研究我和春天有个问题:物业为主或基于构造函数的依赖注入

为了注入一个bean的时候,就是它更好地使用基于属性的依赖注入:

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

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

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

,或者它只是两个相同的解决方案?

+1

这是怎样的一个宗教......无论你喜欢你自己应该做的。 – NilsH 2013-04-28 19:02:10

回答

4

如果你想创建一个不可改变的对象,然后构造带参数的变异是唯一的选择。我更喜欢那个。

+0

那么,这并不完全正确。使用Java Config,您可以自动装配私人字段。 – NilsH 2013-04-28 19:01:18

+1

@NilsH甚至最后的字段?如果是的话,我同意并将删除我的答案。 – maba 2013-04-28 19:03:35

+0

@NilsH你不需要*使用Java配置来自动装载专用字段,它也可以通过'classic'xml配置来完成。 – 2013-04-28 19:06:56

2

,如果你有双向依赖你将需要其中之一是财产注入。通常你应该考虑你的架构,如果你有这样的情况。相互依赖可以在一个新类中提取例如

1

你需要诚实地看着你的代码在做什么,情理之中的事情。从纯粹的面向对象的角度来看,如果您需要依赖于您的类的工作,并且永远不应该改变,那就使用构造函数注入。如果您需要默认依赖关系,但可能会更改(或可选),请使用属性。

但是,这是一个神圣的战争类型的问题。我应该使用XML还是Autowire,应该通过属性还是构造函数进行注入。真正的关键是一致的。如果你是一致的,那么对于下一个可怜的开发人员来说,即使它在技术上不符合OO原则的正确性,也必须在你的代码中工作。如果你不一致,我为下一个人感到抱歉。

我的喜好,而不是它的问题,就是要尽可能多地使用构造函数注入,它让我有更清晰的代码没有所有可能破坏封装逻辑的getter和setter。