Autowired注解是spring用来支持依赖注入的核心利器之一,但是我们或多或少都会遇到requiredasinglebean,but2werefound(2可能是其他数字)的问题,接下来我们从源码的角度去看为什么会出现这个问题,以及这个问题的解法是什么?
首先我们写一个demo来复现一下这个问题。首先我们有一个抽象类AbstractAutowiredDemo,两个实现类AutowiredDemo1,AutowiredDemo2。然后我们在AutowiredDemoController中通过
Autowired依赖注入AbstractAutowiredDemo。RestControllerpublicclassAutowiredDemoController{
AutowiredprivateAbstractAutowiredDemoabstractAutowiredDemo;}ComponentpublicabstractclassAbstractAutowiredDemo{publicabstractStringprint();}ComponentpublicclassAutowiredDemo2extendsAbstractAutowiredDemo{OverridepublicStringprint(){return"AutowiredDemo2";}}ComponentpublicclassAutowiredDemo1extendsAbstractAutowiredDemo{OverridepublicStringprint(){return"AutowiredDemo1";}}此时我们启动项目就会出现如下报错,找到了两个,并且列出了找到的两个其实就是抽象类的实现类。
接下来,我们从源码的角度来看看,spring是如何查找依赖并注入的。
与之前查看
Component注解方法一致,我们全局搜索Autowired,会找到一个叫做AutowiredAnnotationBeanPostProcessor,根据命名AutowiredAnnotationXXX我们可以大概知道这个类是用来处理注解Autowired的。进入AutowiredAnnotationBeanPostProcessor,从注释上我们可以知道这个类可以处理注解
Autowired,Value以及如果支持的话还有Inject,这里我们就只用