1. 来源与标准
注解 | 来源 | 规范/标准 | 包路径 |
---|---|---|---|
@Autowired | Spring 框架提供 | Spring 原生注解 | org.springframework.beans.factory.annotation |
@Resource | Java 标准库 | JSR-250 规范 | javax.annotation |
说明:
@Resource
是 Java EE 标准的一部分,可在非 Spring 环境中使用(如 Jakarta EE)。@Autowired
是 Spring 特有的注解,与 Spring 容器强绑定。
2. 注入方式
注解 | 默认注入方式 | 支持指定名称 | 是否支持按类型(Type) | 是否支持按名称(Name) |
---|---|---|---|---|
@Autowired | 按类型注入 | 需配合 @Qualifier | 是 | 是(需额外注解) |
@Resource | 按名称注入 | 直接通过 name 属性 | 是(名称匹配失败时回退) | 是 |
关键区别:
@Autowired
默认按类型匹配 Bean,若同一类型有多个实例,需结合@Qualifier
指定名称。@Resource
默认按名称匹配 Bean,若未找到名称匹配的 Bean,则回退到按类型匹配。
3. 依赖查找行为
**(1) @Autowired
**
- 流程:
- 按类型查找 Bean。
- 若存在多个同类型 Bean,按字段/属性名称匹配(隐式按名称回退)。
- 若仍无法确定,抛出
NoUniqueBeanDefinitionException
。
- 示例:
java
@Autowired @Qualifier("myBean") // 显式指定名称 private MyBean bean;
**(2) @Resource
**
- 流程:
- 按
name
属性指定的名称查找 Bean。 - 若未指定
name
,按字段/属性名称查找。 - 若按名称未找到,回退到按类型查找。
- 按
- 示例:
java
@Resource(name = "myBean") // 显式指定名称 private MyBean bean;
4. 处理依赖不存在的情况
注解 | 依赖不存在时的行为 | 是否支持 required 属性 |
---|---|---|
@Autowired | 抛出 NoSuchBeanDefinitionException | 是(@Autowired(required = false) ) |
@Resource | 抛出 NoSuchBeanDefinitionException | 否(必须存在匹配的 Bean) |
注意:
@Autowired(required = false)
允许注入null
,适用于可选依赖。@Resource
没有类似机制,依赖必须存在。
5. 适用场景对比
场景 | 推荐注解 | 理由 |
---|---|---|
需要按类型注入 | @Autowired | 默认按类型匹配,减少配置。 |
需要按名称注入 | @Resource | 直接通过 name 属性指定,无需额外注解。 |
非 Spring 环境 | @Resource | 符合 Java 标准,可移植性强。 |
可选依赖(允许为null) | @Autowired | 支持 required = false 。 |
代码简洁性 | 根据需求选择 | 若无需复杂配置,两者均可。 |
6. 示例对比
**(1) 按类型注入**
java
// @Autowired 默认按类型
@Autowired
private UserService userService;
// @Resource 按类型(名称匹配失败时)
@Resource
private UserService userService;
**(2) 按名称注入**
java
// @Autowired 需配合 @Qualifier
@Autowired
@Qualifier("userServiceImpl")
private UserService userService;
// @Resource 直接指定名称
@Resource(name = "userServiceImpl")
private UserService userService;
7. 总结对比表
特性 | @Autowired | @Resource |
---|---|---|
来源 | Spring 特有 | Java 标准(JSR-250) |
默认注入方式 | 按类型 | 按名称 |
指定名称方式 | 需配合 @Qualifier | 通过 name 属性 |
处理多个 Bean | 需显式指定名称 | 优先名称匹配,失败后按类型 |
可选依赖支持 | 支持(required = false ) | 不支持 |
推荐场景 | Spring 项目、按类型注入 | 非 Spring 环境、按名称注入 |
最佳实践
- 优先使用
@Autowired
:在纯 Spring 项目中,利用其按类型注入的简洁性。 - 需要明确名称时用
@Resource
:当需要按名称注入且希望减少注解数量时。 - 避免混合使用:同一项目中保持一致性,提高代码可读性。
通过合理选择注解,可以更高效地管理依赖注入,同时减少配置复杂度。