外观
@Autowired 和 @Resource 的区别是什么?
⭐ 题目日期:
小红书 - 2024/11/11
📝 题解:
在 Spring 中,@Autowired
和 @Resource
都用于依赖注入,但它们在 实现机制、注入规则 和 适用场景 上有显著区别。以下是两者的对比分析:
1. 核心区别总结
2. 详细对比
(1) 默认注入规则
- @Autowired:
默认按 类型 匹配 Bean。
示例:
@Autowired private UserService userService; // 注入类型为 UserService 的 Bean
冲突处理:若存在多个同类型 Bean(如多个
UserService
实现类),需配合@Qualifier
指定名称:@Autowired @Qualifier("userServiceImplA") private UserService userService;
- @Resource:
默认按 名称 匹配 Bean(字段名或
name
属性)。示例:
@Resource private UserService userService; // 按字段名 "userService" 查找 Bean
冲突处理:若未找到同名 Bean,回退到按类型匹配。也可显式指定
name
或type
:@Resource(name = "userServiceImplA") private UserService userService;
(2) 处理多个候选 Bean
- @Autowired 的歧义性: 当存在多个同类型 Bean 时,必须明确指定
@Qualifier
,否则抛出NoUniqueBeanDefinitionException
。
@Autowired
@Qualifier("userServiceImplA")
private UserService userService;
- @Resource 的灵活性: 通过
name
属性直接指定 Bean 名称,或通过type
属性指定类型(但需确保唯一)。
@Resource(name = "userServiceImplA", type = UserServiceImplA.class)
private UserService userService;
(3) 可选依赖处理
- @Autowired 允许注入失败:
@Autowired(required = false)
private OptionalDependency optionalDep; // 允许 optionalDep 为 null
- @Resource 必须注入成功: 若未找到匹配的 Bean,抛出
NoSuchBeanDefinitionException
,无required
属性。
3. 使用场景建议
4. 示例对比
(1) 按类型注入
// @Autowired 按类型匹配
@Autowired
private UserRepository userRepository;
// @Resource 按类型回退
@Resource
private UserRepository userRepository;
(2) 按名称注入
// @Autowired + @Qualifier 指定名称
@Autowired
@Qualifier("jdbcUserRepository")
private UserRepository userRepository;
// @Resource 直接指定名称
@Resource(name = "jdbcUserRepository")
private UserRepository userRepository;
5. 总结
- 优先使用
@Autowired
: 在 Spring 项目中推荐使用@Autowired
,结合@Qualifier
解决歧义性,代码更符合 Spring 生态规范。 - 使用
@Resource
的场景:- 需要按名称注入。
- 项目需兼容非 Spring 容器。
- 避免引入 Spring 特定注解(如纯 Java 配置项目)。
两者各有优劣,根据具体需求选择,确保代码清晰且依赖管理高效。