📌 按类型注入 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 {@Resourceprivate UserRepository userRepository; // 按类型匹配 UserRepositorypublic 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") // 指定按名称匹配 userRepoAprivate 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")
指定名称,避免冲突。