@Resource 和 @Autowired 都是用于依赖注入(Dependency Injection)的注解,常用于 Spring 框架中来自动装配 Bean,但它们有一些本质的区别和使用习惯上的差异 。下面从来源、注入方式、注入优先级、常见使用场景等角度进行详细对比和讲解:
一、基础介绍
| 注解 |
所属 |
说明 |
@Autowired |
Spring 提供(org.springframework.beans.factory.annotation.Autowired) |
按类型(byType)自动注入 |
@Resource |
JDK 提供(javax.annotation.Resource) |
按名称(byName)自动注入,JDK规范,更具有可移植性 |
二、核心区别
✅ 1. 注入方式不同
| 特性 |
@Autowired |
@Resource |
| 默认注入方式 |
按类型(byType) |
按名称(byName) |
| 注入逻辑 |
如果容器中有多个相同类型的 Bean,可结合 @Qualifier 注解指定名称 |
会先按名称找 Bean,找不到再按类型找 |
| 是否可用于构造器 |
✅支持构造器注入 |
❌不支持(只能用于字段或 setter) |
举例:
java
复制代码
@Component
public class UserService {
@Autowired
private UserRepository userRepository; // 按类型注入
}
java
复制代码
@Component
public class UserService {
@Resource
private UserRepository userRepository; // 按名称注入,默认名字是"userRepository"
}
✅ 2. 是否支持 @Qualifier
@Autowired 支持与 @Qualifier("beanName") 配合使用,明确指定注入哪个 Bean。
@Resource 不支持 @Qualifier,但可以通过 @Resource(name="beanName") 指定 Bean 名称。
java
复制代码
@Autowired
@Qualifier("myBean")
private MyService service; // 指定使用名为 myBean 的 Bean
java
复制代码
@Resource(name="myBean")
private MyService service; // 同样指定使用 myBean
✅ 3. 是否必须依赖注入成功
| 注解 |
是否默认必须注入成功 |
@Autowired |
是(可以设置 required = false) |
@Resource |
是(不能设置为非必须) |
java
复制代码
@Autowired(required = false)
private MyBean optionalBean;
三、使用建议与最佳实践
| 场景 |
推荐注解 |
理由 |
| Spring 项目中常规使用 |
@Autowired |
更灵活,支持构造器注入,支持 @Qualifier |
| 跨平台或非 Spring 项目 |
@Resource |
JSR-250 标准,更具有可移植性 |
| 注入第三方组件 |
@Autowired |
结合 @Qualifier 更强大 |
| 注入单一 Bean,名称和属性一致 |
@Resource |
简洁直接 |
四、实战对比举例
多个同类型 Bean 的情况
java
复制代码
@Component("cat")
public class Cat implements Animal {}
@Component("dog")
public class Dog implements Animal {}
@Component
public class Zoo {
// 方式一:按类型 + @Qualifier
@Autowired
@Qualifier("dog")
private Animal animal;
// 方式二:按名称
@Resource(name = "dog")
private Animal animal;
}
五、总结对比表
| 特性 |
@Autowired |
@Resource |
| 提供方 |
Spring |
JDK(JSR-250规范) |
| 默认注入方式 |
按类型 |
按名称 |
| 支持构造器注入 |
✅ |
❌ |
是否支持 @Qualifier |
✅ |
❌(但可用 name) |
| 是否可选注入 |
✅(通过 required=false) |
❌ |
| 可移植性 |
依赖 Spring |
更高,可用于其他容器 |
六、总结一句话
@Autowired 更适用于 Spring 环境,功能更强大;
@Resource 遵循 JSR 标准,按名称注入,更适合简单场景或跨平台代码。