@Resource和@Autowired注解的区别

1. 来源与标准

注解来源规范/标准包路径
@AutowiredSpring 框架提供Spring 原生注解org.springframework.beans.factory.annotation
@ResourceJava 标准库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**
  • 流程
    1. 按类型查找 Bean。
    2. 若存在多个同类型 Bean,按字段/属性名称匹配(隐式按名称回退)。
    3. 若仍无法确定,抛出 NoUniqueBeanDefinitionException
  • 示例
     

    java

    @Autowired
    @Qualifier("myBean") // 显式指定名称
    private MyBean bean;
​**(2) @Resource**
  • 流程
    1. 按 name 属性指定的名称查找 Bean。
    2. 若未指定 name,按字段/属性名称查找。
    3. 若按名称未找到,回退到按类型查找。
  • 示例
     

    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 环境、按名称注入

最佳实践

  1. 优先使用 @Autowired:在纯 Spring 项目中,利用其按类型注入的简洁性。
  2. 需要明确名称时用 @Resource:当需要按名称注入且希望减少注解数量时。
  3. 避免混合使用:同一项目中保持一致性,提高代码可读性。

通过合理选择注解,可以更高效地管理依赖注入,同时减少配置复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值