• spring之@Primary与@Qualifier注解


    一 前言

    本篇内容主要是讲解2个重要的注解使用方式和场景,@Primary,@Qualifier注解;其作用就是消除bean注入时的歧义,能够让spring容器知道加载哪个bean;

    知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)

    二 实现方式

    如下示例中使用被单接口Sheet, 实现类为SheetA , SHeetB ; 由于注入容器时都是 Sheet类型,会发生异常,此时就是使用@Primary或者@Qualifier对注入的bean进行限制,即可实现正常注入;

    2.1 被单接口

    /**
     * @Author lsc
     * <p> 被单</p>
     */
    public interface Sheet {
    
        String getColor();
    }
    

    2.2 被单实现类

    实现类A

    重写getColor()方法;输出red

    /**
     * @Author lsc
     * <p> </p>
     */
    public class SheetA implements Sheet {
    
    
        public String getColor() {
            return "red";
        }
    
    
    }
    

    实现类B

    重写getColor()方法;输出pink

    /**
     * @Author lsc
     * <p> </p>
     */
    public class SheetB implements Sheet {
    
    
    
        public String getColor() {
            return "pink";
        }
    
    }
    

    2.3 配置类

    @Configuration
    public class SheetConfig {
    
    
        @Bean
        public Sheet sheetA(){
            return new SheetA();
        }
    
        @Bean
        public Sheet sheetB(){
            return new SheetB();
        }
    
    }
    

    2.4 测试类

    /**
     * @Author lsc
     * <p> </p>
     */
    @RunWith(SpringJUnit4ClassRunner.class)//创建spring应用上下文
    @ContextConfiguration(classes= {SheetConfig.class})//加载配置类
    public class SheetTest {
    
        @Autowired
        Sheet sheet;
    
        @Test
        public void sheetTest(){
            //
            System.out.println(sheet.getColor());
        }
    }
    

    测试会报异常,原因是向spring容器注入了2个Sheet,无法区分是SheetA 还是 SheetB,所以会造成bean的歧义问题;

    Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException:
    

    解决办法一

    在注入的bean上添加@Primary注解;示例如下,此时向sheetB上添加@Primary注解,spring扫码注入bean时优先注入带有@Primary注解的bean;测试输出结果为pink

        @Bean
        @Primary
        public Sheet sheetB(){
            return new SheetB();
        }
    

    解决办法二

    注入bean时添加@Qualifier注解,限定注入的Bean;此时输出就是red

        @Qualifier("sheetA")//限定注入Bean ID
        @Autowired
        Sheet sheet;
    
  • 相关阅读:
    css实现鼠标移入table时出现滚动条且table内容不移位
    SASS学习笔记
    html5--canvas学习笔记
    在iframe里调用parent.func()引出的js函数运行在它们被定义的作用域里,而不是它们被执行的作用域里
    css background-position:x% y%
    js十进制等互相转换
    jsp中的动作元素:<jsp:plugin>
    终于有时间写代码了
    OK 开始实践书上的项目一:即使标记
    我没有忘记敲代码
  • 原文地址:https://www.cnblogs.com/zszxz/p/12715601.html
Copyright © 2020-2023  润新知