目录
[1 字段注入](#1 字段注入)
[2 构造器注入](#2 构造器注入)
[3 set注入](#3 set注入)
总结:通用的三种注入方式

- 优先使用构造器注入
- 谨慎使用 Setter 注入
- 避免滥用字段注入
- 通过构造器传入依赖,确保对象创建时即完成初始化。
- 通过 Setter 方法注入依赖,支持动态修改。
- 直接通过反射注入字段,代码简洁但隐藏依赖。
1 字段注入
-
核心思想:直接通过反射将依赖注入到字段,无需显式构造器或 Setter 方法。
-
特点:
-
代码简洁:减少样板代码。
-
隐藏依赖:依赖关系不透明,不利于单元测试。
-
慎用场景:仅推荐用于快速原型开发或非核心组件。
-
java
public class ProductService {
@Autowired
private InventoryService inventoryService; // 直接注入字段
}
2 构造器注入
-
核心思想:通过构造器参数传入依赖对象,确保 Bean 在实例化时即完成依赖注入。
-
特点:
-
强制依赖 :适合不可变(
final
)或必需依赖。 -
线程安全:依赖在对象创建时即被赋值,避免后续修改。
-
推荐方式:Spring 官方推荐的注入方式,尤其适用于单例 Bean。
-
java
public class OrderService {
private final PaymentService paymentService;
// 构造器注入(Spring 4.3+ 可省略 @Autowired)
@Autowired
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}
java
@RequiredArgsConstructor
public class OrderService {
private final PaymentService paymentService;
}
3 set注入
-
核心思想:通过 Setter 方法设置依赖对象,允许依赖在 Bean 创建后动态修改。
-
特点:
-
可选依赖:适合非必需或可变的依赖。
-
灵活性:允许在运行时重新注入依赖(但需注意线程安全)。
-
java
public class UserService {
private DatabaseService databaseService;
// Setter 方法注入
@Autowired
public void setDatabaseService(DatabaseService databaseService) {
this.databaseService = databaseService;
}
}