@Primary用于解决同类型多Bean注入歧义,标注在首选实现类或@Bean方法上,使@Autowired按类型注入时默认选择该Bean;同一类型仅允许一个@Primary,优先级低于@Qualifier。

@Primary 是 Spring 框架提供的一个注解,用于在多个相同类型的 Bean 中**标记其中一个为首选 Bean**,当进行按类型(@Autowired)注入时,Spring 会优先选择被 @Primary 标记的 Bean,避免因候选 Bean 不唯一导致的 NoUniqueBeanDefinitionException。
什么时候需要 @Primary
当你有多个实现类注册为同一个接口的 Bean 时,比如:
- 接口
PaymentService - 两个实现:
AlipayService和WechatPayService - 两者都用
@Service注册进 Spring 容器
此时若直接 @Autowired private PaymentService service;,Spring 不知道该选哪个,就会报错。这时就可以用 @Primary 明确“默认用哪一个”。
如何使用 @Primary
只需在你希望设为默认的 Bean 类或配置方法上添加 @Primary 注解即可:
- 加在实现类上(推荐):
@Service @Primary public class AlipayService implements PaymentService { ... } - 加在
@Bean方法上(适合配置类):@Configuration public class PaymentConfig { @Bean @Primary public PaymentService alipayService() { return new AlipayService(); } @Bean public PaymentService wechatService() { return new WechatPayService(); } }
@Primary 和 @Qualifier 的区别
@Primary 是“全局默认”,影响所有未显式指定 Bean 名称的同类型注入;@Qualifier 是“精准指定”,用于明确选某个特定 Bean:
- 用了
@Primary后,@Autowired PaymentService默认注入AlipayService - 仍可通过
@Autowired @Qualifier("wechatService") PaymentService service;强制注入另一个 - 两者不冲突:
@Primary提供兜底逻辑,@Qualifier保留灵活性
注意事项
注意:同一类型下只能有一个 @Primary Bean,否则 Spring 启动会失败(报 ConflictingBeanDefinitionException)。如果多个 Bean 都加了 @Primary,需检查是否误配或遗漏排除逻辑。
另外,@Primary 对 @Resource(按名称注入)无效,它只影响基于类型的自动装配(@Autowired)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











