依赖注入(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 |
发表回复