首页 > 分享 > @Autowired(required=false)注入注意的问题

@Autowired(required=false)注入注意的问题

最新推荐文章于 2024-09-08 09:57:49 发布

智_永无止境 于 2018-03-16 14:47:14 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

1、前言

在使用spring开发过程中,我们基本上都是使用@Autowired这个注解,用来注入已有的bean。但是有些时候,会注入失败。当我们加上参数(required=false)就能解决。今天整理一个我在实际开发中的例子

2、required属性

@Autowired(required=true):当使用@Autowired注解的时候,其实默认就是@Autowired(required=true),表示注入的时候,该bean必须存在,否则就会注入失败。

@Autowired(required=false):表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错。

3、使用

我们的正常使用会在Controller层注入service,在service中注入mapper。

但是如果有一个公用方法,需要注入某个元素,并且这个方法在公用模块里。当该模块被引入其他项目中,该项目中并需要注入所需的bean时,就出现如图【2】的类似错误。那么问题来了,我们项目中并不需要该要注入的类,使得整个项目报错。

4、原因分析及解决

在容器的启动过程中,会初始化很多bean,这也是spring的核心之一(IOC)。但是在注入的过程中,扫描到公共方法中要注入的bean,并未找到,强行注入就会注入失败。我们又不能单独的去除改方法,所以我们采取的思想就是有bean就注入,没有就不注入。解决办法就是@Autowired(required=false)。

5、容器的父子关系

通过日志如图:

通过日志我们可以看到,容器的启动顺序。

先加载父容器(spring),后加载子容器(springmvc)。所以在Controller里面注入service时,父容器中的bean已经初始化完毕,所以正常注入。 在父子容器中,父容器元素对子容器可见,子容器对父容器的元素不可见。所以父容器中不能获取子容器的元素,但是子容器可以获取父容器的元素。当前容器均可获取当前容器中的元素,也就是说在service中可以注入其他service。

6、问题纠正

之前写的博文可能因为测试出现问题,导致一些错误结论,如下图:

但是,当前容器不可以注入自己。这样就会不停的注入自己,陷入死循环。从而找不到要注入的bean。如图:

当然我们几乎不能这样坑自己,然而我就这么坑了自己。。。

经@南信院二年级三班优秀数学课代表加三好学生 这位笔友提醒,笔者重新测试,发现自己注入自己是完全可以的。这是spring框架提供的三级缓存专门来解决循环依赖的。在这里特此纠正一下,同时感谢这位笔友。

测试截图如下:

 

这里测试一切都是正常的,包括正常调用。

但是如果使用构造函数注入的话,就是是死循环,如图:

相关知识

@Autowired(required=false)注入注意的问题
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
基于javaweb+mysql的springboot宠物商城系统宠物交易平台(java+springboot+maven+mybatis+vue+mysql)
基于javaweb的宠物商城系统(java+jsp+javascript+servlet+mysql)
基于Java的宠物之家小程序 宠物服务小程序【源码+调试】
Android之android exported=“false”作用
Java项目:宠物平台系统(java+SpringBoot+Mybaits+Vue+elementui+mysql)
Spring
sql注入
解决fatal error: require(): Failed opening required ‘data/tdk.php’ (include

网址: @Autowired(required=false)注入注意的问题 https://m.mcbbbk.com/newsview499938.html

所属分类:萌宠日常
上一篇: ubuntu16.04安装ope
下一篇: 警惕,亲密关系中的情感依赖!