使用@Autowired(不是xml配置)时,是否有人可以比较set / constructor绑定的优缺点?
请参阅以下示例:
public class Example{
private Logger log;
// constructor wiring
@Autowired
public Example(Logger log){
this.log = log;
}
}
public class Example{
// setter wiring
@Autowired
private Logger log;
}
答案 0 :(得分:12)
这完全是一个偏好问题。
Spring在构造函数注入时皱眉,或者至少习惯了,因为这样会出现循环依赖,并且很难管理(构造函数中需要B,B在构造函数中需要A)。
一个实际的区别是,对于字段上的@Autowired
,您不需要setter方法,这样一方面可以使类更小,更容易阅读,但另一方面使类模拟有点丑陋。
我更喜欢野外注射。
答案 1 :(得分:6)
在所有人投票进行现场注射后很长时间内扮演魔鬼拥护者,使用从投票同事那里收集的构造函数有一些优势:
我仍然喜欢这样一个事实:如果我需要另一个类中的带注释字段,我可以只进行复制粘贴并完成它而不是将其添加到构造函数中,但它只是次要考虑因素。 / p>
答案 2 :(得分:2)
注释setter的一个特定原因:setter可以将bean引用保存到静态变量。
答案 3 :(得分:0)
如果您没有使用自动装配,那么构造函数和setter注入之间存在很大差异。您以不同方式编写XML以注入依赖项。并且setter注入依赖项是可选的,而构造函数注入依赖项则不是。
使用自动装配,我能想到的唯一原因是避免循环依赖问题。如果A有B对构造函数具有自动连接依赖性而B对A具有相同的依赖性,则我们无法实例化它们中的任何一个。给一个setter依赖可能会有所帮助。