zoukankan      html  css  js  c++  java
  • 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;
    
  • 相关阅读:
    (转) Linux中profile、bashrc、bash_profile之间的区别和联系
    Ubuntu 安装MyEclipse10
    VMware_ubuntu设置共享文件夹
    (转载)Android出现“Read-only file system”解决办法
    Android 执行 adb shell 命令
    android传感器使用
    Android源码下载和编译过程
    jquery实现的ajax
    转载SQL_trace 和10046使用
    查看Oracle相关日志 ADRCI
  • 原文地址:https://www.cnblogs.com/zszxz/p/12715601.html
Copyright © 2011-2022 走看看