@Primary 注解引出的问题

本文详细解析了Spring框架中@Primary和@Qualifier注解的作用与区别。当存在多个实现类时,@Primary用于指定默认注入的实现类,解决Spring注入的不确定性;而@Qualifier则用于为实现类指定别名,便于在注入时明确指定所需的实现类。

@Primary 注解

       刚看到这个,还以为是持久层的注解呢,以为和@Id差不多,一查才知道,这两个风马牛不相及,反倒和@Qualifier以及@Resource有点像了,但是相比而言,后面两个更加的灵活。

      可以看这两个博客博客一】【博客二

      我觉得第一篇博客讲的不太对,结合第二篇应该就能理解第一篇中的【而@Qualifier这个注解则指定某个bean有没有资格进行注入】这句话了。

      当一个接口,有几种不同的实现类,如果一个以上的实现类使用了 bean 注解(也就是@Copmonent 或者 @Service),那么就会 spring 在自动注入的时候就不知道注入那个实现类了,因为每个实现类都是平等的,会报出如下异常:

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [main.service.Singer] is defined: expected single matching bean but found 2: metalSinger,operaSinger

      @Primary 注解的意思就是以哪个实现类为主. 也就是spring容器知道该注入哪个实现类了.

      而 @Qualifier 就是给每个实现类取别名,注入的时候需要指定别名【 也就是在配置 bean 的时候需要使用 @Qualifier 指定 bean 的 name 属性,同时在注入的时候需要使用 @Qualifier 指定 bean 的 name 属性,使得 @Autowired 也不得不按照bean的 nama属性进行注入了 】

 

转载于:https://www.cnblogs.com/daimajun/p/7136079.html

`@Primary`是Spring依赖注入中解决多Bean冲突的轻量级工具,用于解决依赖注入时的选择冲突,通过标记默认实现简化配置逻辑,其核心价值在于降低代码复杂度与提升可维护性,适用于需要统一默认行为的场景[^2]。 在Spring框架中,当存在多个同类型的Bean可供注入时,Spring默认会抛出异常。使用`@Primary`注解,可以指示Spring在遇到多个候选Bean时优先选择标记了该注解的Bean。其主要特点包括解决多个相同类型Bean的注入冲突,适用于全局范围,默认优先选择被标记为`@Primary`的Bean,还可以与`@Qualifier`配合使用,满足更复杂的注入需求[^1]。 ### 应用场景 - **多个实现**:当一个接口有多个实现类时,如果想要默认注入某一个实现,可以使用`@Primary`。 - **不同配置环境**:在多种配置环境下,有时需要优先使用某个特定的Bean,比如在测试环境和生产环境中可能会有不同的实现。 - **避免显式指定**:如果不希望在每次注入时都显式指定Bean的名称,可以使用`@Primary`来简化代码[^3]。 ### 示例代码 ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; // 定义一个接口 interface MyService { void doSomething(); } // 实现类1 class MyServiceImpl1 implements MyService { @Override public void doSomething() { System.out.println("MyServiceImpl1 is doing something."); } } // 实现类2,标记为 @Primary @Primary class MyServiceImpl2 implements MyService { @Override public void doSomething() { System.out.println("MyServiceImpl2 is doing something."); } } // 配置类 @Configuration class AppConfig { @Bean MyService myService1() { return new MyServiceImpl1(); } @Bean @Primary MyService myService2() { return new MyServiceImpl2(); } } ``` 在上述示例中,当进行依赖注入时,如果没有显式指定要注入的Bean名称,Spring会优先选择标记了`@Primary`注解的`MyServiceImpl2`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值