@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") 指定名称,避免冲突。
