@Autowired
@Autowired
是 Spring 框架提供的核心注解之一,用于自动注入依赖对象,避免手动创建对象实例,实现依赖注入(DI),降低代码耦合度。以下是其详细使用方法和注意事项:
一、基本使用场景
@Autowired
可以标注在字段、构造方法、setter 方法上,Spring 会自动从容器中查找匹配的 bean 并注入。
1. 标注在字段上(最常用)
直接在类的成员变量上使用 @Autowired
,Spring 会自动注入对应的 bean:
@Service
public class UserService {
// 自动注入 UserRepository 类型的 bean
@Autowired
private UserRepository userRepository;
public User findUserById(Integer id) {
return userRepository.findById(id); // 直接使用注入的对象
}
}
2. 标注在构造方法上
在构造方法上使用 @Autowired
,Spring 会在创建对象时通过构造方法注入依赖(推荐用于必需的依赖):
@Service
public class UserService {
private final UserRepository userRepository;
// 构造方法注入(Spring 4.3+ 对单构造方法可省略 @Autowired)
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
**优势**:
- 依赖在对象创建时就已初始化,避免 `null` 风险。
- 便于单元测试时通过构造方法手动传入 mock 对象。
3. 标注在 setter 方法上
在 setter 方法上使用 @Autowired
,Spring 会调用该方法注入依赖(适用于可选依赖):
@Service
public class UserService {
private UserRepository userRepository;
// setter 方法注入
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
二、依赖匹配规则
@Autowired
默认按照类型(Type) 匹配 bean,若容器中存在多个同类型的 bean,会按以下规则处理:
1. 按名称(Name)匹配
当存在多个同类型 bean 时,可通过 @Qualifier
注解指定 bean 的名称:
@Service
public class UserService {
// 容器中存在多个 UserRepository 类型的 bean(如 userRepo1、userRepo2)
@Autowired
@Qualifier("userRepo1") // 指定注入名称为 userRepo1 的 bean
private UserRepository userRepository;
}
- 被注入的 bean 需要指定名称(如 `@Repository("userRepo1")`)。
2. 按 @Primary
优先注入
若某个 bean 被 @Primary
标注,当存在多个同类型 bean 时,会优先注入该 bean:
// 定义两个同类型的 bean
@Repository
@Primary // 优先注入
public class UserRepositoryImpl implements UserRepository { ... }
@Repository
public class AnotherUserRepository implements UserRepository { ... }
// 注入时会优先选择 UserRepositoryImpl
@Service
public class UserService {
@Autowired
private UserRepository userRepository; // 实际注入的是 UserRepositoryImpl
}
三、非必需依赖(允许为 null)
默认情况下,@Autowired
要求依赖必须存在,否则会抛出 NoSuchBeanDefinitionException
。若依赖是可选的,可通过 required = false
允许为 null
:
@Service
public class UserService {
// 允许 userRepository 为 null(不存在时不报错)
@Autowired(required = false)
private UserRepository userRepository;
public User findUserById(Integer id) {
if (userRepository != null) { // 需判断非空
return userRepository.findById(id);
}
return null;
}
}
四、注意事项
注入的是 Spring 容器中的 bean
被注入的对象必须是被 Spring 管理的 bean(即通过@Component
、@Service
、@Repository
、@Controller
等注解声明,或在配置类中通过@Bean
定义)。避免循环依赖
若 A 依赖 B,B 又依赖 A,会导致循环依赖。Spring 可解决构造方法以外的循环依赖,但应尽量避免设计上的循环依赖。接口注入优先
注入时建议使用接口类型而非实现类,例如注入UserRepository
接口而非其实现类UserRepositoryImpl
,符合依赖倒置原则。与
@Resource
的区别@Autowired
是 Spring 注解,默认按类型匹配,支持@Qualifier
和@Primary
。@Resource
是 Java EE 注解,默认按名称匹配,不支持 Spring 的特有功能(如@Primary
)。
五、总结
@Autowired
的核心作用是自动注入 Spring 容器中的依赖 bean,使用时需注意:
- 可标注在字段、构造方法、setter 方法上,推荐构造方法注入(强制依赖)。
- 多实例匹配时,用
@Qualifier
指定名称或@Primary
标记优先 bean。 - 非必需依赖添加
required = false
,避免注入失败。
合理使用 @Autowired
可大幅减少手动管理依赖的代码,提高系统的灵活性和可维护性。
本作品采用《CC 协议》,转载必须注明作者和本文链接