🧩 一、@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
明确指定