@Autowired 和 @Resource 注解的区别

前言

  • @Autowired 和 Resource 是 Spring 中用于依赖注入的注解,但两者在实现机制和使用方式上有显著差异。

主要区别

1.来源不同

  • @Autowired:由 Spring 框架提供(org.springframework.beans.factory.annotation),与 Spring 强耦合。
  • @Resource:由 JSR-250 规范定义(javax.annotation.Resource),属于 Java 标准,通用性更强。

2.注入方式

默认行为:

  • @Autowired
    • 默认按 类型(byType) 注入。若存在多个同类型 Bean,则按 名称(byName) 匹配。
    • 需配合 @Qualifier 指定名称。
java 复制代码
@Autowired
@Qualifier("userServiceA") // 指定 Bean 名称
private UserService userService;
  • @Resource
    • 默认按 名称(byName) 注入 。若未指定名称,则按 类型(byType) 回退。
    • 可通过 name 或 type 属性精确控制。
java 复制代码
@Resource(name = "userServiceA") // 显式指定名称
private UserService userService;

3.参数支持

  • @Autowired 仅支持 required 参数,控制是否必须注入(默认为 true):
java 复制代码
@Autowired   //@Autowired( required = "true")
@Qualifier("userServiceA") // 指定 Bean 名称
private UserService userService;
  • @Resource 支持 name、type、lookup 等参数,灵活性更高:
java 复制代码
@Resource(name = "userServiceA") // 显式指定名称
private UserService userService;

4.注入位置

  • @Autowired:支持更广泛的注入位置
    • 字段
    • 构造器
    • Setter 方法
    • 普通方法
java 复制代码
@Autowired
public void setupService(UserService userService) {
    this.userService = userService;
}
  • @Resource:主要用于字段和 Setter 方法
java 复制代码
@Resource
public void setUserService(UserService userService) {
    this.userService = userService;
}

5.异常处理

  • 无匹配 Bean
    • @Autowired
      (1)若 required = true(默认)且无匹配 Bean,抛出 NoSuchBeanDefinitionException。
      (2)若 required = false,允许注入 null。
    • @Resource
      (1)若未找到指定名称或类型的 Bean,直接抛出 NoSuchBeanDefinitionException。
  • 多匹配 Bean
    • @Autowired
      (1)若存在多个同类型 Bean,需通过 @Qualifier 指定名称,否则抛出 NoUniqueBeanDefinitionException。
    • @Resource
      (2)若未指定 name 且存在多个同类型 Bean,按名称匹配失败后抛出 NoUniqueBeanDefinitionException。

6.代码示例【多个同类型bean】

  • 向IOC容器中通过@Service注解注入两个同类型的bean【均为UserService接口的实现类】
java 复制代码
// 定义接口及实现类
public interface UserService { /* ... */ }

@Service("userServiceA")
public class UserServiceA implements UserService { /* ... */ }

@Service("userServiceB")
public class UserServiceB implements UserService { /* ... */ }
  • @Autowired 解决方案
java 复制代码
@Autowired
@Qualifier("userServiceA")
private UserService userService;
  • @Resource 解决方案
java 复制代码
@Resource(name = "userServiceA")
private UserService userService;

总结


使用建议

  • 优先使用 @Autowired:在纯 Spring 项目中,结合 @Qualifier 可满足大多数需求。
  • 选择 @Resource:需要跨框架兼容,或需通过名称精确控制注入时。
相关推荐
小小小米粒3 分钟前
阿姆达尔定律(Amdahl‘s Law)
java·开发语言
知彼解己4 分钟前
Java 版本演进
java·开发语言·spring boot
极客先躯20 分钟前
高级java每日一道面试题-2026年05月11日-实战篇[Docker]-如何容器化金融产品推荐系统?
java·运维·docker·容器·金融·高级面试·金融产品推荐系统
朱容zr33313337 分钟前
为什么推荐使用自增主键?使用UUID作为主键的优缺点是什么?
java·运维·数据库·后端·mysql·面试·性能优化
知彼解己1 小时前
Eclipse Temurin:企业级 Java JDK 发行版的最佳实践
java·ide·eclipse
朱容zr3331331 小时前
请解释“回表”的概念。
java·前端·数据库
不吃辣4901 小时前
vibe coding | 如何做一个 AI 音乐生成工具?
java·人工智能·后端·ai·ai编程
NWU_LK1 小时前
【WebFlux】第八篇 —— 自定义调度器
java
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第210题】【10_网络协议篇】第1题:说说 TCP/IP 网络五层模型
java·网络协议·tcp/ip·计算机网络·网络五层模型
wuminyu1 小时前
JUC组件逐层剥离与深度剖析
java·linux·c语言·jvm·c++·算法