@Resource注解的两种注入方式
📌 按类型注入 vs 按名称注入
在 @Resource
注解中:
- 默认是按名称注入(如果
name
指定,按名称查找)。 - 如果没有指定
name
,则按类型查找。
1️⃣ 按类型注入(默认情况)
如果 @Resource
没有指定 name
,Spring 会按照类型匹配注入 同类型的 Bean。
示例
假设有两个 Bean
@Component
public class UserRepository {
public void save() {
System.out.println("User saved!");
}
}
@Component
public class OrderRepository {
public void save() {
System.out.println("Order saved!");
}
}
按类型注入
@Service
public class UserService {
@Resource
private UserRepository userRepository; // 按类型匹配 UserRepository
public void saveUser() {
userRepository.save();
}
}
✅ Spring 会自动匹配 UserRepository
并注入。
⚠ 注意:
- 如果
UserRepository
有多个 Bean,可能会报错:NoUniqueBeanDefinitionException: expected single matching bean but found 2
- 解决方案:
- 使用
@Primary
指定默认 Bean - 用
@Resource(name="xxx")
强制按名称匹配 - 改用
@Autowired + @Qualifier
- 使用
2️⃣ 按名称注入
如果 @Resource(name="beanName")
指定了 name
,Spring 优先按名称查找。
示例
定义多个相同类型的 Bean
@Component("userRepoA")
public class UserRepositoryA implements UserRepository {
public void save() {
System.out.println("User A saved!");
}
}
@Component("userRepoB")
public class UserRepositoryB implements UserRepository {
public void save() {
System.out.println("User B saved!");
}
}
按名称注入
@Service
public class UserService {
@Resource(name = "userRepoA") // 指定按名称匹配 userRepoA
private UserRepository userRepository;
public void saveUser() {
userRepository.save();
}
}
✅ Spring 只会注入 userRepoA
,不会报错。
3️⃣ 按类型 vs 按名称总结
方式 | 规则 | 适用场景 |
---|---|---|
按类型 | @Resource 不写 name ,Spring 按类型查找 Bean | 只有一个同类型的 Bean 时,推荐使用 |
按名称 | @Resource(name="beanName") 按名称查找 | 有多个相同类型的 Bean 时,必须指定名称,否则会报错 |
🚀 什么时候用哪种方式?
✅ 如果只有一个 Bean,直接用 @Resource
(按类型)。
✅ 如果有多个 Bean,建议用 @Resource(name="xxx")
指定名称,避免冲突。