🧩 一、@Autowired 和 @Resource 的基本作用
| 注解 | 来源 | 作用 |
|---|---|---|
@Autowired | Spring 提供(org.springframework.beans.factory.annotation.Autowired) | 按类型 自动注入 |
@Resource | JDK 提供(javax.annotation.Resource) | 默认按名称 注入,找不到再按类型 |
🚦 二、核心区别详解
| 对比项 | @Autowired | @Resource |
|---|---|---|
| 注解来源 | Spring 框架 | JDK(JSR-250 规范) |
| 默认注入方式 | 按类型注入(byType) | 按名称注入(byName) |
| 是否可选 | 可以配合 @Autowired(required = false) 设置为可选 | 默认必须有该 Bean |
| 是否支持构造器 | ✅ 支持构造器注入 | ❌ 不支持构造器注入 |
是否支持 @Qualifier | ✅ 支持,用于指定具体 Bean 名称 | ❌ 不支持 @Qualifier(直接用 name) |
| Spring 推荐 | ✅ 是 | 可以用但不推荐(除非兼容旧项目) |
🔍 三、举例对比
✅ 1. 使用 @Autowired + @Qualifier(推荐方式)
@Component
public class MyService {@Autowired@Qualifier("userDaoImpl1")private UserDao userDao;
}
Spring 会按类型找,然后用
@Qualifier精确到 Bean 名称。
✅ 2. 使用 @Resource
@Component
public class MyService {@Resource(name = "userDaoImpl1")private UserDao userDao;
}
Spring 会直接按照
name = "userDaoImpl1"去找 Bean。
✅ 3. 构造器注入(只能用 @Autowired)
@Component
public class MyService {private final UserDao userDao;@Autowiredpublic MyService(UserDao userDao) {this.userDao = userDao;}
}
💣 四、常见坑点
1. 多个实现类时,不指定名称会报错
public interface UserDao {}
@Component("userDaoImpl1") class UserDaoImpl1 implements UserDao {}
@Component("userDaoImpl2") class UserDaoImpl2 implements UserDao {}
注入时:
@Autowired // ❌ 报错:有两个实现不知道选哪个
private UserDao userDao;
✅ 用
@Qualifier或@Primary来指定
2. @Resource 默认按名称,字段名要一致!
@Resource
private UserDao userDaoImpl1; // ✅ 会去找名字叫 "userDaoImpl1" 的 Bean
🧠 五、一句话总结
@Autowired是 Spring 原生推荐,默认按类型注入,配合@Qualifier使用最灵活;
@Resource是 JDK 标准注解,默认按名称,适合兼容旧系统,但不如@Autowired强大。
✅ 实际开发建议:
- Spring Boot 项目中:优先使用
@Autowired+ 构造器注入 - 多实现类时:使用
@Qualifier或@Primary明确指定