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;
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。