@Primary是Spring Boot中解决多实现单注入冲突的默认选择机制,需加在@Component/@Service等组件类或@Bean方法上,同一类型仅允许一个,优先级低于@Qualifier。

@Primary 注解是 Spring Boot 中解决“多实现、单注入”冲突最直接的方式——它不改变 Bean 的定义数量,只告诉容器:“当没指名道姓要谁时,请默认选我”。设置默认 Bean 的关键不在写法多复杂,而在于理解它的触发条件和限制规则。
在哪加 @Primary 才生效
这个注解必须加在能被 Spring 容器识别为 Bean 的地方:
- 加在 @Component、@Service、@Repository 等组件类上(适用于包扫描场景)
- 加在 @Bean 方法上(适用于配置类中手动定义 Bean 的场景)
- 不能加在接口、抽象类或普通方法上,否则无效
只能有一个 @Primary
同一个类型下,Spring 不允许存在多个 @Primary 标记的 Bean。如果误加了两个,启动时会抛出异常:
NoSuchBeanDefinitionException 或 NoUniqueBeanDefinitionException(取决于上下文)这不是警告,而是硬性校验。所以团队协作时建议在代码审查中检查该注解是否唯一。
@Primary 和 @Qualifier 的关系
它们不是互斥的,而是分层配合:
- @Primary 是兜底策略:没加 @Qualifier 时自动生效
- @Qualifier 是显式指令:一旦写了 @Qualifier("xxx"),Spring 就忽略 @Primary,严格按名称匹配
- 优先级顺序明确:@Qualifier > @Primary
例如,即使 SmsService 只有 AliyunSmsService 标了 @Primary,你仍可在某处用 @Autowired @Qualifier("tencentSmsService") 主动选腾讯实现。
常见误用提醒
几个高频踩坑点:
- 加了 @Primary 却还是报 NoUniqueBeanDefinitionException?检查是否漏写了 @Service/@Component,导致类根本没注册成 Bean
- 在配置类里定义了两个同类型 @Bean,但都忘了加 @Primary?那依然会冲突——必须至少一个标上
- 以为 @Primary 能跨环境生效?它本身不感知 profile,如需按环境切换默认实现,应搭配 @ConditionalOnProperty 或 @Profile 使用


















