注解 | 来源 | 作用 |
---|---|---|
@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 推荐 | ✅ 是 | 可以用但不推荐(除非兼容旧项目) |
@Autowired
+ @Qualifier
(推荐方式)@Component
public class MyService {
@Autowired
@Qualifier("userDaoImpl1")
private UserDao userDao;
}
Spring 会按类型找,然后用
@Qualifier
精确到 Bean 名称。
@Resource
@Component
public class MyService {
@Resource(name = "userDaoImpl1")
private UserDao userDao;
}
Spring 会直接按照
name = "userDaoImpl1"
去找 Bean。
@Autowired
)@Component
public class MyService {
private final UserDao userDao;
@Autowired
public MyService(UserDao userDao) {
this.userDao = userDao;
}
}
public interface UserDao {}
@Component("userDaoImpl1") class UserDaoImpl1 implements UserDao {}
@Component("userDaoImpl2") class UserDaoImpl2 implements UserDao {}
注入时:
@Autowired // ❌ 报错:有两个实现不知道选哪个
private UserDao userDao;
✅ 用
@Qualifier
或@Primary
来指定
@Resource
默认按名称,字段名要一致!@Resource
private UserDao userDaoImpl1; // ✅ 会去找名字叫 "userDaoImpl1" 的 Bean
@Autowired
是 Spring 原生推荐,默认按类型注入,配合@Qualifier
使用最灵活;
@Resource
是 JDK 标准注解,默认按名称,适合兼容旧系统,但不如@Autowired
强大。
✅ 实际开发建议:
@Autowired
+ 构造器注入@Qualifier
或 @Primary
明确指定