春天autowiring setter /构造函数PROs和CONs

时间:2011-04-16 12:28:10

标签: spring constructor setter autowired

使用@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;
}

4 个答案:

答案 0 :(得分:12)

这完全是一个偏好问题。

Spring在构造函数注入时皱眉,或者至少习惯了,因为这样会出现循环依赖,并且很难管理(构造函数中需要B,B在构造函数中需要A)。

一个实际的区别是,对于字段上的@Autowired,您不需要setter方法,这样一方面可以使类更小,更容易阅读,但另一方面使类模拟有点丑陋。

我更喜欢野外注射。

答案 1 :(得分:6)

在所有人投票进行现场注射后很长时间内扮演魔鬼拥护者,使用从投票同事那里收集的构造函数有一些优势:

  • 允许使用final和强制不变性
  • 忘记在构造函数中注释注入属性而不是作为字段注释
  • 使某人偶尔构造一个应该通过注射器
  • 构建的对象变得更加困难

我仍然喜欢这样一个事实:如果我需要另一个类中的带注释字段,我可以只进行复制粘贴并完成它而不是将其添加到构造函数中,但它只是次要考虑因素。 / p>

答案 2 :(得分:2)

注释setter的一个特定原因:setter可以将bean引用保存到静态变量。

答案 3 :(得分:0)

如果您没有使用自动装配,那么构造函数和setter注入之间存在很大差异。您以不同方式编写XML以注入依赖项。并且setter注入依赖项是可选的,而构造函数注入依赖项则不是。

使用自动装配,我能想到的唯一原因是避免循环依赖问题。如果A有B对构造函数具有自动连接依赖性而B对A具有相同的依赖性,则我们无法实例化它们中的任何一个。给一个setter依赖可能会有所帮助。