spring的@Autowired报红了,

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

摘要:

aa.jpg

我们在使用@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注解,我们下一篇文章见吧(手动狗头)

猜你喜欢

转载自juejin.im/post/7017269954017755150