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

Pom*_*rio 14 setter spring constructor 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;
}
Run Code Online (Sandbox Code Playgroud)

Boz*_*zho 13

这完全是一个偏好问题.

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

一个实际的区别是,@Autowired在一个字段上你不需要一个setter方法,它一方面使类更小,更容易阅读,但另一方面使得模拟类更加丑陋.

我更喜欢野外注射.


Lol*_*olo 6

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

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

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