@Resource vs @Autowired 在Spring中的使用和区别
在Spring开发中,我们常会接触两个用于实现引用模块注入的注解:@Resource
和 @Autowired
。它们在使用上有些相似之处,但本质上来看,有所区别。本文将给出两者的详细介绍和对比,帮助你更好地了解和选择适合的注入方式。
一. @Resource 注解介绍
@Resource
是来自 JSR-250 标准的注解,它旨在扩展 Java 对象管理和依赖注入的能力,常用于 Java EE 和 Spring 中。
@Resource
private UserService userService;
这里 userService
将被注入到 Spring 实体类中。
基本规则
- 按照 name 来匹配 Bean:如果指定了
name
属性,Spring 会按名字搜索 Bean - 如果未指定 name,则默认会根据字段名来搜索 Bean
- 如果找不到名字匹配,则根据类型匹配
支持属性
@Resource(name = "myService")
private MyService service;
二. @Autowired 注解介绍
@Autowired
是 Spring 提供的自动注入模型,通过 Spring IoC 实现由实体自动解析并注入相关类型。
@Autowired
private UserService userService;
这里 Spring 会根据 UserService
的类型解析 Bean 并进行注入。
基本规则
- 按照类型匹配,如果有多个 Bean 匹配,则根据
@Qualifier
指定 - 支持
required = false
,用于避免注入失败时抛异常
@Autowired(required = false)
private UserService userService;
三. @Resource vs @Autowired
注解 | 来源 | 默认匹配规则 | 是否可配合 @Qualifier | 是否支持 required 属性 |
---|---|---|---|---|
@Resource | JSR-250 | 先按 name,后按 type | 否 | 否 |
@Autowired | Spring | 先按 type,可配合 Qualifier 指定 name | 是 | 是 |
四. 实际示例对比
// 1. @Resource
@Resource(name = "myService")
private MyService service;// 2. @Autowired + @Qualifier
@Autowired
@Qualifier("myService")
private MyService service;
上面两者效果相同,均指定名称为 myService
的 Bean 注入到 service
。
五. 使用建议
- 如果考虑经济性和与 Java EE 的兼容,可以使用
@Resource
- 如果对 Spring 依赖更强,需要类型强匹配和更多选项,选择
@Autowired
- Spring Boot 环境下,推荐使用
@Autowired
,配合@Qualifier
六. 结论
@Resource
和@Autowired
同为实现引用注入功能的注解,但各自有优势和适用场景。如果你需要更好的 Spring 组件化支持和类型编译器提示,推荐使用 @Autowired
;如果需要与旧有 Java EE 系统兼容,则考虑 @Resource
。
英语学习圈:
- inject: 注入
- dependency: 依赖
- annotation: 注解
- qualifier: 限定器
- resolve: 解析,解决
- compatible: 兼容的
- behavior: 行为