今天在做项目的时候突然遇到一个问题:启动服务器的时候spring
没报错,可是当我访问某个页面的时候spring报request bean is currently in creation: is there an unresolvable circular reference
的错误,后来查了些资源终于找出来了原因,这里和大家分享一下;
首先产生这个错误的原因是因为spring循环注入了,什么是循环注入?举个列子我有一个类a,a有一个构造器里面的参数是类b,然后类b里面有个构造器参数是类c,类c里面有个构造器参数是类a,就是我们会发现其实引用循环了a 里面有b的引用,b里面有c的引用,c里面又有a的引用。
首先讲一下构造器的循环依赖:
1
2
3
4
5
6
|
public class a
{
public a(b b)
{
}
}
|
1
2
3
4
5
6
|
public class b
{
public b(c c)
{
}
}
|
1
2
3
4
5
6
|
public class c
{
public c(a a)
{
}
}
|
当我们用spring来加载a的时候spring的流程是这样的:
1:spring创建a首先去当前创建池中去查找当前a是否在创建,如果发明没有创建则准备其构造器需要的参数b,然后把创建a的标识放入当前创建池中。
2:spring创建b首先去当前创建池中去查找当前b是否在创建,如果发现没有创建则准备其构造器需要的参数c,然后把创建b的标识放入当前创建池中。
3:spring创建c首先去当前创建池中去查找当前c是否在创建,如果发现没有创建则准备其构造器需要的参数a,然后把创建c的标识放入当前创建池中。
4:spring创建c需要的a,这个时候会发现在当前创建池中已经有a的标识,a正在创建中则抛出beancurrentlyincreationexception。
set方式的循环注入分2种情况,第一种情况是可以解决的循环注入就是单列情况下。第二种情况就是无法解决的循环注入就是多列情况下,下面分析一下原因:
先看第一种情况,还是拿上面的abc3个类来说明问题,只不过这次不是构造器里面的参数,而是换成他们的成员变量,然后通过set方式类注入,这里代码就不写了直接讲下:
单列下set方式的注入流程是这样的:
1:spring创建a,首先根据其无参构造器创建一个对象a,然后提前暴露出创建出来的这个a对象,然后再当前的创建池中放入创建a的标识,然后进行set方法注入b。
2:spring创建b,首先根据其无参构造器创建一个对象b,然后提前暴露出创建出来的这个b对象,然后在当前的创建池中放入创建b的标识,然后进行set方法的注入c。
3:spring创建c,首先根据其无参构造器创建一个对象c,然后提前暴露出创建处理的这个c对象,然后在当前的创建池中放入创建c的标识,然后进行set方法的注入a。
4:在第三步注入a的时候由于提前暴露出来了创建出来的a对象所以不会报beancurrentlyincreationexception的错误。
多列下set方式的循环注入不能解决的原因是在多列的情况下,当创建对象的时候spring不会提前暴露创建处理的对象a,这样的话则会和构造器循环注入出现一样的情况最终导致报错。
解决办法:
去掉最后一层的注入或者中间某一层的注入。通过spring getbean
的方式去获取对象
讲完了。讲的不对的地方谢谢提出来。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对快网idc的支持。如果你想了解更多相关内容请查看下面相关链接
原文链接:https://blog.csdn.net/chengxu2011/article/details/8478290
相关文章
- 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
- 64M VPS建站:怎样优化以提高网站加载速度? 2025-06-10
- 64M VPS建站:是否适合初学者操作和管理? 2025-06-10
- ASP.NET自助建站系统中的用户注册和登录功能定制方法 2025-06-10
- ASP.NET自助建站系统的域名绑定与解析教程 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-05-27 60
-
Mybatis分页插件PageHelper配置及使用方法详解
2025-05-29 58 -
2025-05-29 2
-
2025-05-25 81
-
2025-05-25 34