豆米
65.98 MB · 2025-12-15
在 Spring 框架中,依赖注入(Dependency Injection, DI)是核心特性之一,用于实现松耦合和更高的代码可维护性。Spring 提供了多种依赖注入方式,包括构造器注入、@Autowired 注入、Setter 注入和 @Resource 注入。以下是对这几种注入方式的详细分析,包括推荐使用场景、优缺点以及最终推荐。
通过构造函数将依赖注入到类中。
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
final,保证对象初始化后依赖不可变。@Lazy 或其他方式解决)。通过 Spring 的 @Autowired 注解直接注入字段或方法(通常是 Setter 或构造函数)。
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
}
final,可能被意外修改。null。通过 Setter 方法注入依赖。
@Service
public class UserService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
通过 JSR-250 标准的 @Resource 注解进行注入,通常基于名称匹配。
@Service
public class UserService {
@Resource
private UserRepository userRepository;
}
@Autowired,不支持复杂的注入逻辑(如 @Qualifier 精细控制)。@Autowired 类似,难以手动替换依赖。@Resource 的优先级低于 @Autowired,可能导致配置混淆。| 注入方式 | 不可变性 | 测试友好 | 灵活性 | 代码简洁性 | 循环依赖风险 | 推荐场景 |
|---|---|---|---|---|---|---|
| 构造器注入 | 高 | 高 | 低 | 中 | 高 | 核心业务逻辑、强制依赖 |
| @Autowired 注入 | 低 | 低 | 高 | 高 | 中 | 快速开发、原型设计 |
| Setter 注入 | 低 | 中 | 高 | 低 | 中 | 可选依赖、动态替换依赖 |
| @Resource 注入 | 低 | 低 | 中 | 高 | 中 | 跨容器兼容、名称明确依赖 |
首选构造器注入:
次选 Setter 注入:
谨慎使用 @Autowired 和 @Resource:
@Autowired 和 @Resource)虽然简洁,但牺牲了不可变性和测试友好性,容易隐藏问题(如循环依赖或空指针)。@Autowired 或 @Resource 直接在字段上),因为它降低了代码可维护性和测试性。@Lazy 或调整设计)。Setter 注入和字段注入虽然能缓解循环依赖,但可能掩盖设计问题。@RequiredArgsConstructor 简化构造函数编写。@Resource 是一个选择,但实际中 Spring 的普及使其优势有限。@Autowired 和 @Resource),除非在快速原型或简单场景中。