当一个接口有多个不同实现时,注入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;
}