當一個接口有多個不同實現時,注入Spring的時候會產生org.springframework.beans.factory.NoUniqueBeanDefinitionException異常信息。
解決方式有2種,使用@Primary 和 @Qualifier註解。
註解 | 區別 |
---|---|
@Primary | 優先注入該註解的標註的bean |
@Qualifier | 確定注入該註解標定的bean |
1、@Qualifier
該註解的意思是直接注入該註解標定的bean,而非選擇。如:
public interface ITeacher {
String getName();
}
@Component
public class MathTeacher implements ITeacher {
public String getName() {
return "Math";
}
}
@Component
public class EnglishTeacher implements ITeacher {
public String getName() {
return "English";
}
}
如果這個時候使用@Autowired就會報錯,需要指定注入具體對象:
public class ClassRoom {
@Autowired
@Qualifier("englishTeacher")
public ITeacher teacher;
}
2、@Primary
@Qualifier是在使用注入的時候,使用方明確指出使用哪個;@Primary更像是提供方告訴你優先使用哪個。舉個例子,你實現排序接口的很多的實例,如冒泡排序,快排,選擇排序等等。在使用者選擇不明確的情況下,你希望他優先(默認)選擇冒泡排序。這樣你就在冒泡排序實現類上使用@Primary予以標識。
public interface ISort {
String getName();
}
@Component
@Primary
public class MaopaoSort implements ISort {
public String getName() {
return "冒泡排序";
}
}
@Component
public class XuanzeSort implements ISort {
public String getName() {
return "選擇排序";
}
}
public class MySort {
@Autowired
public ISort sort;
}