当使用@Autowired注解进行自动注时,Spring容器中匹配的Bean数目有且只有一个,否则将抛出BeanCrantionException异常。
问题一:没有相匹配的Bean
为解决这个问题,可以使用@Autowired(required=false),这就等于告诉Spring,在找不到匹配的Bean是也不报错。由于一般情况下使用@Autowired的地方都是需要注入Bean的,所以一般很少会用到。
问题二:有多个相匹配的Bean
解决方式:使用@Qualifier注释指定注入Bean的名称
格式:@Qualifier(“Bean的名称”)
@Autowired和@Qualifier结合使用,自动注入就从byType转变成byName。@Autowired可以对成员变量、方法以及构造函数进行注释,而@Qualifier的标注对象是成员变量、方法入参、构造函数入参。
@Qualifier只能和@Autowired结合使用,是对@Autowired补充,@Qualifire对方法入参进行注释会降低代码的可读性,而对成员变量的注释会相对好一些。
对成员变量使用 @Qualifier 注释
public class Boss {
@Autowired
private Car car;
@Autowired
@Qualifier("office")
private Office office;
…
}
对构造函数变量使用 @Qualifier 注释
public class Boss {
private Car car;
private Office office;
@Autowired
public Boss(Car car , @Qualifier("office")Office office){
this.car = car;
this.office = office ;
}
}
对方法入参使用 @Qualifier 注释
(使用 @Qualifier 注释指定注入 Bean 的名称)
@Autowired
public void setOffice(@Qualifier("office")Office office) {
this.office = office;
}