@primary是spring boot中解决多实现类注入歧义的默认选择机制,当存在多个同类型bean且未用@qualifier指定时,优先注入被@primary标记的bean;其优先级低于@qualifier,且不可重复标注。

@Primary 是 Spring Boot 中解决“一个接口多个实现类”时注入歧义的核心注解,它的作用很明确:当容器中存在多个同类型的 Bean,而你又没用 @Qualifier 显式指定时,Spring 会自动选择被 @Primary 标记的那个作为默认注入对象。
什么时候必须用 @Primary
当你定义了一个接口(比如 PaymentService),并提供了两个实现类(WechatPaymentService 和 AlipayPaymentService),又在某个 Service 或 Controller 中直接写:
@Autowired private PaymentService paymentService;
此时 Spring 无法判断该注入哪一个——会抛出 NoUniqueBeanDefinitionException。加 @Primary 就是告诉容器:“如果没有特别说明,就选我”。
@Primary 的使用方式
它直接加在具体实现类上,配合 @Component、@Service 等注册注解一起使用:
- @Service @Primary public class WechatPaymentService implements PaymentService { ... }
- @Service public class AlipayPaymentService implements PaymentService { ... }
这样,只要没显式指定,WechatPaymentService 就会被注入。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
@Primary 和 @Qualifier 的优先级关系
@Primary 只是“默认选项”,不是“强制锁定”。如果同时用了 @Qualifier,后者优先级更高:
- @Autowired @Qualifier("alipayPaymentService") private PaymentService paymentService;
- 哪怕 WechatPaymentService 被标了 @Primary,这里依然注入 AlipayPaymentService
也就是说:@Qualifier > @Primary,这是明确的优先级规则。
注意事项和常见误区
多个类不能同时加 @Primary,否则 Spring 启动时会报错,提示“找到多个 @Primary Bean”;
@Primary 对构造器注入、setter 注入、字段注入都生效;
它不控制 Bean 的加载顺序,只影响依赖注入时的“选择逻辑”;
如果项目需要按配置动态切换首选 Bean,建议改用 @ConditionalOnProperty 或 @Profile,而不是硬编码 @Primary。










