1、前言
在使用spring开发过程中,我们基本上都是使用@Autowired这个注解,用来注入已有的bean。但是有些时候,会注入失败。当我们加上参数(required=false)就能解决。今天整理一个我在实际开发中的例子
2、required属性
3、使用
我们的正常使用会在Controller层注入service,在service中注入mapper。
但是如果有一个公用方法,需要注入某个元素,并且这个方法在公用模块里。当该模块被引入其他项目中,该项目中并需要注入所需的bean时,就出现如图【2】的类似错误。那么问题来了,我们项目中并不需要该要注入的类,使得整个项目报错。
4、原因分析及解决
在容器的启动过程中,会初始化很多bean,这也是spring的核心之一(IOC)。但是在注入的过程中,扫描到公共方法中要注入的bean,并未找到,强行注入就会注入失败。我们又不能单独的去除改方法,所以我们采取的思想就是有bean就注入,没有就不注入。解决办法就是@Autowired(required=false)。
5、容器的父子关系
通过日志如图:
通过日志我们可以看到,容器的启动顺序。
6、问题纠正
之前写的博文可能因为测试出现问题,导致一些错误结论,如下图:
但是,当前容器不可以注入自己。这样就会不停的注入自己,陷入死循环。从而找不到要注入的bean。如图:
当然我们几乎不能这样坑自己,然而我就这么坑了自己。。。
经笔友提醒,笔者重新测试,发现自己注入自己是完全可以的。这是spring框架提供的三级缓存专门来解决循环依赖的。在这里特此纠正一下,同时感谢这位笔友。
测试截图如下:
这里测试一切都是正常的,包括正常调用。
但是如果使用构造函数注入的话,就是是死循环,如图:
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_43842093/article/details/121757582
内容来源于网络,如有侵权,请联系作者删除!