前言
- @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。
- @Autowired
- 多匹配 Bean
- @Autowired
(1)若存在多个同类型 Bean,需通过 @Qualifier 指定名称,否则抛出 NoUniqueBeanDefinitionException。 - @Resource
(2)若未指定 name 且存在多个同类型 Bean,按名称匹配失败后抛出 NoUniqueBeanDefinitionException。
- @Autowired
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:需要跨框架兼容,或需通过名称精确控制注入时。