15

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

4 回答 4

13

这完全是一个偏好问题。

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

一个实际的区别是,@Autowired在字段上你不需要 setter 方法,一方面使类更小更易于阅读,但另一方面使模拟类有点难看。

我更喜欢现场注入。

于 2011-04-16T15:04:01.353 回答
6

在每个人都投票支持字段注入很久之后,扮演魔鬼代言人,这里有一些使用从周围投票同事那里收集的构造函数的优点:

  • 允许使用 final 并强制执行不变性
  • 与字段相比,在构造函数中忘记注释注入属性的可能性要小一些
  • 使某人更难随便构造一个应该通过注入器构造的对象

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

于 2013-02-20T21:17:31.820 回答
2

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

于 2012-08-23T20:10:36.797 回答
0

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

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

于 2015-11-26T14:20:33.743 回答