spring为何推荐使用构造器注入
filed注入的缺点
-
对于IOC容器以外的环境,除了使用反射来提供它需要的依赖之外,无法复用该实现类。而且将一直是个潜在的隐患,因为你不调用将一直无法发现NullPointException的存在。
-
使用field注入可能会导致循环依赖
public class A { @Autowired private B b; } public class B { @Autowired private A a; }
constructor注入的优点
- 依赖不可变(components as immutable objects), 即注入对象为final
- 依赖不可为空(required dependencies are not null),省去对注入参数的检查
- 提升了代码的可复用性: 非IOC容器环境可使用new实例化该类的对象
- 避免循环依赖: 使用构造器注入, 如果存在循环依赖, 在spring项目启动的时候就会抛出异常:
BeanCurrentlyInCreationException:Requested bean is currently in creation: Is there an unresolvable circular reference?