小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
摘要:
我们在使用@Autowired注解的时候,很常见的就会报以上这个,到底是啥原因呢,还有怎么解决呢,那就康康这篇文章吧!!
话不多说,直接上硬菜!!!
可选的自动装配
默认情况下,@Autowired具有强契约性,也就是说其所标注的属性或者参数必须是可装配的,如果没有Bean可以装配到@Autowired所标注的属性或参数中,自动装配就会失败,抛出NoSuchBeanDefinitionException异常,
两种情况:
①:属性不一定非要装配,null值也可以
在这种场景下,可以通过设置@Autowired的required属性为false来配置自动装配是可选的,如下:
@Autowired(required = false)
private Instrument instrument;
复制代码
在这里,spring姜尝试装配instrument属性,但是如果没有查找到与之匹配的类型为Insrument的bean,应用不会发生任何问题,而instrument属性的值会设置为null。
注意required属性可以用于@Autowired注解所使用的任何地方,但是当好似用构造器装配时,只有一个构造器可以将@Autowired的required属性设置为true,其他使用该注解所标注的构造器只能将required属性设置为false,此外,当时用@Autowired标注多个构造器时,spring就会从所有满足装配条件的构造器中选择入参最多的那个构造器
②spring不缺少适合装配的bean
这种场景的问题在于spring中可能会有多个符合装配条件的Bean(最少2个),并且都可以被装配到属性或者参数中,在这个时候,为了帮助spring认清渣女(bushi),选中善良美丽的老婆(需要的Bean),便有一个新的注解搭配应运而生,那就是@Qualifier注解。
例如:为了确保spring为 《告白气球》 bean的前奏要用吉他(guitar)演奏,即使有其他的乐器bean也可以用来演奏这个前奏,但是我们在这里就可以使用@Qulifier注解来明确指出使用吉他(指定Bean):
@Autowired
@Qualifire("guitar")
private Instrument instrument;
复制代码
如上在注入时将会去尝试注入id为guitar的Bean;
使用@Qualifire意味着把@Autowired的byType自动装备转换为显示的byName装配,而如上的例子就是通过指定Bean的id来缩小自动装配候选Bean的范围,缩小的只剩下了一个;
而除了通过Bean的id来缩小范围之外,我们还可以通过在Bean上直接使用qualifier来缩小范围,例如,假设吉他(guitar)的Bean时使用如下的xml进行声明的
<bean class = "com.springinaction.beanxml.Guitar">
<qualifier value = "stringed"></qualifier>
</bean>
复制代码
这里的元素限定了吉他是一个Stringed(弦乐器),除了可以在xml中指定qualifier,还可以使用@Qualifire注解来标注guitar类:
@Qualifier("Stringed")
public class Guitar implements Instrument{
}
复制代码
注:关系@Qualifier注解,我们下一篇文章见吧(手动狗头)