spring为何推荐使用构造器注入

filed注入的缺点

  1. 对于IOC容器以外的环境,除了使用反射来提供它需要的依赖之外,无法复用该实现类。而且将一直是个潜在的隐患,因为你不调用将一直无法发现NullPointException的存在。
  2. 使用field注入可能会导致循环依赖
public class A {
       @Autowired
       private B b;
   }
   
public class B {
       @Autowired
       private A a;
   }

constructor注入的优点

  1. 依赖不可变(components as immutable objects), 即注入对象为final
  2. 依赖不可为空(required dependencies are not null),省去对注入参数的检查
  3. 提升了代码的可复用性: 非IOC容器环境可使用new实例化该类的对象
  4. 避免循环依赖: 使用构造器注入, 如果存在循环依赖, 在spring项目启动的时候就会抛出异常:
BeanCurrentlyInCreationException:Requested bean is currently in creation: Is there an unresolvable circular reference?

 

上一篇:Autofac实现有条件的DI


下一篇:Spring源码分析第二弹 - DI 依赖注入分析