在Spring Boot中,@Autowired
和@Resource
都是用于依赖注入(DI)的注解,但它们在来源、注入策略和使用方式上有明显区别:
1. 来源不同
注解 |
所属框架/标准 |
包路径 |
|
Spring框架原生注解 |
|
|
JavaEE标准(JSR-250) |
(JDK内置) |
注意:Spring Boot兼容@Resource
,无需额外配置。
2. 默认注入策略
注解 |
默认注入策略 |
行为说明 |
|
按类型(byType) |
根据Bean的类型匹配注入。若存在多个同类型Bean,需配合 指定名称。 |
|
按名称(byName) → 按类型 |
优先按Bean名称匹配。若未指定名称,则回退到按类型匹配。 |
3. 关键使用区别
(1) @Autowired
示例
// 1. 按类型注入(默认)
@Autowired
private UserService userService;
// 2. 存在多个同类型Bean时,用 @Qualifier 按名称指定
@Autowired
@Qualifier("userServiceImplA")
private UserService userService;
// 3. 可选注入(找不到Bean时不报错)
@Autowired(required = false)
private Optional<UserService> userService;
(2) @Resource
示例
// 1. 按名称注入(默认匹配字段名 "userService")
@Resource
private UserService userService;
// 2. 显式指定Bean名称
@Resource(name = "userServiceImplA")
private UserService service;
// 3. 指定类型(避免按名称匹配)
@Resource(type = UserServiceImpl.class)
private UserService service;
4. 主要差异总结
特性 |
|
|
来源 |
Spring原生 |
JavaEE标准 |
默认策略 |
按类型(byType) |
按名称(byName) |
支持构造函数注入 |
✅ 是 |
❌ 否(仅用于字段/方法) |
可选注入 |
|
无直接支持(需配合 ) |
多Bean冲突解决 |
需配合 指定名称 |
自带 或 属性 |
5. 如何选择?
- **推荐使用
@Autowired
**:
纯Spring生态项目首选,与Spring功能(如构造函数注入、@Qualifier
)集成更好。 - 使用
@Resource
的场景:
-
- 需要精确按名称注入Bean。
- 项目需兼容JavaEE标准(如未来迁移到其他容器)。
- 避免引入Spring特有注解(减少耦合)。
附:解决依赖冲突示例
// 存在两个实现类
@Component("serviceA")
public class UserServiceImplA implements UserService {...}
@Component("serviceB")
public class UserServiceImplB implements UserService {...}
// ✅ @Autowired + @Qualifier 按名称注入
@Autowired
@Qualifier("serviceA")
private UserService service;
// ✅ @Resource 直接指定名称
@Resource(name = "serviceA")
private UserService service;
结论:优先用@Autowired
搭配@Qualifier
,语义更清晰;若需按名称注入,@Resource
更简洁。