为什么Spring不推荐@Autowired用于字段注入
背景
- Spring是Java程序员常用的框架之一。
- 官方从Spring 4.0开始不推荐使用@Autowired进行字段注入。
Spring注入方式
-
基于构造器注入:在构造器上使用@Autowired。
- 优点:可以声明字段为final,确保字段在构造时被初始化。
-
基于setter方法注入:在setter方法上使用@Autowired。
- 优点:在无参数构造器或工厂方法实例化Bean时,Spring会调用setter方法注入依赖。
-
基于字段注入:在字段上使用@Autowired。
- 优点:最简洁,无需getter和setter代码,无需声明构造函数。
基于字段注入的缺点
- 容易引发NPE:Spring不会对依赖的bean是否为null进行判断,可能导致运行时的空指针异常。
- 缓解单一职责原则的违反:字段注入隐藏了依赖关系,可能导致代码质量降低。
Spring官方推荐
- 推荐使用基于构造器注入的方式。
循环依赖问题
- 构造器注入可能存在循环依赖问题。
- 解决方案:
- 重构代码:消除循环依赖,可能成本较高。
- 使用@Lazy注解:延迟初始化bean,解决循环依赖。
总结
- Spring提供三种注入方式:字段注入、setter方法注入、构造器注入。
- 官方不推荐使用@Autowired进行字段注入,主要原因是容易引发NPE,且无法在编译时期发现。
- 构造器注入因其在单元测试和不可变性方面的优势,被视为最佳实践。