Spring中@Primary注解的作用与使用

 更新时间:2025年06月06日 09:10:10   作者:长勺  
本文主要介绍了Spring中@Primary注解的作用与使用,@Primary 注解用于解决依赖注入时的歧义性问题,具有一定的参考价值,感兴趣的可以了解一下

在 Spring 框架中,@Primary 注解用于解决依赖注入时的歧义性(Ambiguity)问题。当 Spring 容器中存在多个相同类型的 Bean 时,通过 @Primary 标记其中一个 Bean 作为默认的首选注入对象。

核心作用:

  • 解决多个同类型 Bean 的冲突当有多个实现同一接口或相同类型的 Bean 时,Spring 无法自动确定注入哪个 Bean,会抛出 NoUniqueBeanDefinitionException。使用 @Primary 可指定默认注入的 Bean。

  • 隐式选择优先级被标记为 @Primary 的 Bean 会被优先注入,无需额外使用 @Qualifier 指定名称。

使用示例:

场景定义

假设有一个支付接口 PaymentService 和两个实现类:

public interface PaymentService {
    void pay();
}

@Component
public class CreditCardService implements PaymentService {
    @Override
    public void pay() { System.out.println("信用卡支付"); }
}

@Component
public class AlipayService implements PaymentService {
    @Override
    public void pay() { System.out.println("支付宝支付"); }
}

问题:依赖注入歧义

若直接注入 PaymentService,Spring 会报错:

@Autowired
private PaymentService paymentService; // 抛出 NoUniqueBeanDefinitionException

解决方案:使用 @Primary

标记其中一个实现类为默认首选:

@Component
@Primary // 指定为默认注入的 Bean
public class AlipayService implements PaymentService { ... }

此时注入会成功选择 AlipayService

@Autowired
private PaymentService paymentService; // 隐式注入 AlipayService

与其他注解的优先级:

  • @Primary vs @Qualifier

    • @Qualifier 显式指定 Bean 名称的优先级高于 @Primary
    • 例如:@Autowired @Qualifier("creditCardService") 会覆盖 @Primary
  • 多个 @Primary 的冲突如果多个同类型 Bean 都被标记为 @Primary,Spring 会再次抛出歧义异常。

常见使用场景:

  • 数据库多数据源配置在多个 DataSource Bean 中,标记默认使用的数据源。
  • 不同环境下的实现类例如在测试和生产环境中提供同一接口的不同实现,通过 @Primary 切换默认实现。
  • 第三方库的扩展当覆盖第三方库提供的 Bean 时,将自己的实现标记为 @Primary

配置方式:

除了注解在类上,也可以在 @Bean 方法中使用:

@Configuration
public class AppConfig {
    @Bean
    @Primary // 标记此 Bean 为首选
    public PaymentService alipayService() {
        return new AlipayService();
    }
}

总结:

场景解决方案
多个同类型 Bean,需默认注入一个在目标 Bean 添加 @Primary
需要临时覆盖默认注入配合 @Qualifier 指定名称

关键点:@Primary 是 Spring 解决依赖注入歧义性的轻量级方案,通过隐式指定默认 Bean 简化配置,但在需要精确控制的场景中仍需结合 @Qualifier 使用。

到此这篇关于Spring中@Primary注解的作用与使用的文章就介绍到这了,更多相关Spring @Primary内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java课设案例之百行代码实现简易计算器

    Java课设案例之百行代码实现简易计算器

    下面这篇文章主要给大家介绍了关于Java课设案例之百行代码实现简易计算器的相关资料,这是一个关于java简单计算器的完整课程设计以及源码,需要的朋友可以参考下
    2023-06-06
  • java模拟post请求登录猫扑示例分享

    java模拟post请求登录猫扑示例分享

    这篇文章主要介绍了java模拟post请求登录猫扑的小示例,需要的朋友可以参考下
    2014-02-02
  • maven搭建java ee项目图文教程

    maven搭建java ee项目图文教程

    这篇文章主要为大家详细介绍了maven搭建java ee项目图文教程,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • 如何基于ThreadPoolExecutor创建线程池并操作

    如何基于ThreadPoolExecutor创建线程池并操作

    这篇文章主要介绍了如何基于ThreadPoolExecutor创建线程池并操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 把Java程序转换成exe,可直接运行的实现

    把Java程序转换成exe,可直接运行的实现

    这篇文章主要介绍了把Java程序转换成exe,可直接运行的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 以实例简介Java中线程池的工作特点

    以实例简介Java中线程池的工作特点

    这篇文章主要介绍了以实例简介Java中线程池的工作特点,线程池是Java实现多线程编程的基础,需要的朋友可以参考下
    2015-09-09
  • Java中6种单例模式写法代码实例

    Java中6种单例模式写法代码实例

    这篇文章主要介绍了Java中6种单例模式写法代码实例,某个类任何情况下只有一个实例,并提供一个全局访问点来获取该实例,Java6种单例模式有2种懒汉式,2种饿汉式,静态内部类 ,枚举类,需要的朋友可以参考下
    2024-01-01
  • Java统计英文句子中出现次数最多的单词并计算出现次数的方法

    Java统计英文句子中出现次数最多的单词并计算出现次数的方法

    这篇文章主要介绍了Java统计英文句子中出现次数最多的单词并计算出现次数的方法,涉及java针对英文句子的字符串遍历、转换、正则替换、计算等相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • spring Bean创建的完整过程记录

    spring Bean创建的完整过程记录

    这篇文章主要给大家介绍了关于Spring中Bean实例创建的相关资料,文中通过实例代码和图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • 使用SpringBoot整合Jpa的过程详解

    使用SpringBoot整合Jpa的过程详解

    SpringBoot是一种快速开发框架,它简化了Java应用程序的开发过程,而Jpa是Java持久化规范的一种实现,将SpringBoot与Jpa整合可以更加方便地进行数据库操作,提高开发效率,本文将介绍如何使用Spring Boot整合Jpa,帮助读者快速上手并应用于实际项目中
    2023-12-12

最新评论