为什么Spring不推荐@Autowired用于字段注入

背景

  • Spring是Java程序员常用的框架之一。
  • 官方从Spring 4.0开始不推荐使用@Autowired进行字段注入。

Spring注入方式

  1. 基于构造器注入:在构造器上使用@Autowired。

    • 优点:可以声明字段为final,确保字段在构造时被初始化。
  2. 基于setter方法注入:在setter方法上使用@Autowired。

    • 优点:在无参数构造器或工厂方法实例化Bean时,Spring会调用setter方法注入依赖。
  3. 基于字段注入:在字段上使用@Autowired。

    • 优点:最简洁,无需getter和setter代码,无需声明构造函数。

基于字段注入的缺点

  1. 容易引发NPE:Spring不会对依赖的bean是否为null进行判断,可能导致运行时的空指针异常。
  2. 缓解单一职责原则的违反:字段注入隐藏了依赖关系,可能导致代码质量降低。

Spring官方推荐

  • 推荐使用基于构造器注入的方式。

循环依赖问题

  • 构造器注入可能存在循环依赖问题。
  • 解决方案:
    1. 重构代码:消除循环依赖,可能成本较高。
    2. 使用@Lazy注解:延迟初始化bean,解决循环依赖。

总结

  • Spring提供三种注入方式:字段注入、setter方法注入、构造器注入。
  • 官方不推荐使用@Autowired进行字段注入,主要原因是容易引发NPE,且无法在编译时期发现。
  • 构造器注入因其在单元测试和不可变性方面的优势,被视为最佳实践。