依赖注入(Dependency Injection,简称 DI)是 控制反转(IoC) 的一种实现方式,核心思想是:对象不负责依赖对象的创建和管理,而是由外部容器(如 Spring IoC 容器)将依赖对象注入进来

常见的 三种依赖注入方式如下:


1. 构造器注入(Constructor Injection)

  • 原理:通过类的构造方法传入依赖对象。
  • 特点
    • 依赖在对象创建时就被强制注入,保证了对象的完整性(不可缺少依赖)。
    • 适合依赖较多且为必需项的场景。
  • 示例(Java / Spring)public class UserService { private final UserRepository userRepository; // 构造器注入 public UserService(UserRepository userRepository) { this.userRepository = userRepository; } }

2. Setter方法注入(Setter Injection)

  • 原理:通过类的 setter 方法注入依赖对象。
  • 特点
    • 依赖对象是可选的,可以在对象创建后灵活修改。
    • 缺点是对象可能在完全初始化之前被使用,容易出现 NullPointerException
  • 示例public class UserService { private UserRepository userRepository; // Setter注入 public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; } }

3. 字段注入(Field Injection)

  • 原理:直接在类的成员变量上使用注解(如 @Autowired)注入依赖。
  • 特点
    • 代码最简洁,不需要构造器和 setter。
    • 缺点是 违背了依赖倒置原则(依赖不可见),不利于单元测试(无法通过构造器或 setter 传入 mock 对象)。
  • 示例public class UserService { @Autowired private UserRepository userRepository; }

🔑 总结对比

注入方式优点缺点适用场景
构造器注入保证依赖不可变,强制依赖完整性依赖多时构造器参数过长依赖必须且固定
Setter方法注入灵活,可选依赖依赖可被修改,可能未初始化完全依赖可选或可变
字段注入简单,代码量少不利测试,违背SOLID原则快速开发、Demo