目录
[1. 构造器注入](#1. 构造器注入)
[2. 字段注入](#2. 字段注入)
[3. Setter注入](#3. Setter注入)
[4. 方法注入](#4. 方法注入)
1. 构造器注入
java
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired // Spring 4.3+ 可以省略
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
特点是:
- 通过类的构造方法注入依赖
- 不可变的依赖(final属性)
- 推荐使用, 特别是对于强制依赖
- 便于单元测试
2. 字段注入
java
@Service
public class UserService {
@Autowire
private UserRepository userRepository;
}
特点是:
- 直接在字段上加@Autowir
- 代码简洁,但不够灵活
- 不能用于final字段
- 不推荐使用(难以测试,隐藏依赖关系)
3. Setter注入
java
@Service
public class UserService {
private UserRepository userRepository;
@Autowired
public setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
特点是:
-
通过setter方法注入依赖
-
适用于可选依赖
-
允许对象在创建后被重新配置
-
比字段注入更易于测试
4. 方法注入
java
@Service
public class UserService {
private UserRepository userRepository;
@Autowired
public publish(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
特点:
-
通过任意方法注入依赖
-
方法名可以自定义,不限于setter
-
可以用于初始化逻辑
-
支持多个参数注入
最佳实践建议
-
优先使用构造器注入 - 特别是对于强制依赖
-
可选依赖使用setter注入
-
避免使用字段注入 - 虽然方便但不利于测试和维护
-
对于复杂初始化逻辑使用方法注入