@primary是spring解决同类型多bean注入歧义的注解,标注在具体实现类或@bean方法上,指定该bean为同类型注入的默认候选,与多态无关,需配合@autowired类型注入生效。

@Primary 是 Spring 用来解决“同类型多 Bean”注入歧义的核心手段,它不涉及多态语法层面的重载或继承控制,而是告诉容器:当按类型自动注入(@Autowired)且存在多个候选 Bean 时,优先选我这个。
明确 @Primary 的作用对象
它标注在具体实现类(或 @Bean 方法)上,不是接口或抽象类。Spring 不关心你是否用了多态设计,只看容器里注册了多少个该接口类型的实例。
- 只要接口有多个
@Service/@Component实现,就构成“多实现”场景 - @Primary 标在其中一个实现类上,它就成了该接口类型的默认注入目标
- 其他实现类依然可用,只是不会被默认选中
典型写法:给主实现加 @Primary
比如支付接口 PaymentService 有三个实现:
@Service @Primary public class AlipayService implements PaymentService@Service public class WechatPayService implements PaymentService@Service public class MockPayService implements PaymentService
此时写 @Autowired private PaymentService paymentService;,Spring 就会注入 AlipayService 实例 —— 不用改调用代码,也不用每个地方都加 @Qualifier。
@Primary 和 @Qualifier 可以共存
@Primary 定义的是“默认行为”,@Qualifier 是“临时覆盖”。两者不冲突:
- 没加
@Qualifier:走 @Primary 指定的那个 - 加了
@Qualifier("wechatPayService"):哪怕它没标 @Primary,也会注入微信实现 - 一个类同时标了
@Service("alipay")和@Primary,它的 bean name 是 alipay,优先级也最高
注意配置生效的前提
@Primary 生效需要满足两个基本条件:
- 所有实现类都成功注册为 Spring Bean(比如加了
@Service或通过@Bean手动注册) - 注入点使用的是类型匹配注入(
@Autowired),而不是基于名称的@Resource(它优先按 name 查找) - 如果用了构造器注入,@Primary 同样起作用,Spring 会在多个候选构造参数中选带 @Primary 的那个 Bean
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











