1. 程式人生 > 程式設計 >Spring @Primary和@Qualifier註解原理解析

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;

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。