当前位置: 首页 > 编程笔记 >

spring循环注入异常问题的解决方案

华化
2023-03-14
本文向大家介绍spring循环注入异常问题的解决方案,包括了spring循环注入异常问题的解决方案的使用技巧和注意事项,需要的朋友参考一下

今天在做项目的时候突然遇到一个问题:启动服务器的时候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的引用。

循环依赖又分为构造器循环依赖和set循环依赖:

首先讲一下构造器的循环依赖:

public class A
{
  public A(B b)
  {
  }
}
public class B
{
  public B(C c)
  {
  }
}
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方式的循环注入:

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的方式去获取对象

讲完了。讲的不对的地方谢谢提出来。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小牛知识库的支持。如果你想了解更多相关内容请查看下面相关链接

 类似资料:
  • 在我的应用程序中,我们使用多个数据源,因此我们有多个数据库配置(会话工厂)。在我们的本地(whindows机器)上一切正常,但当我们将war文件部署到Unix时,应用程序失败,出现以下异常: 组织。springframework。豆。工厂BeanCreationException:创建名为“cpnRepository”的bean时出错:自动连线依赖项的注入失败;嵌套的异常是org。springfr

  • 我有一个开发项目,使用SpringDataJPA和MapStruct在实体和DTO之间进行映射。上周我决定是时候解决vs问题了,我已经推迟了一段时间。我选择使用和在需要时加载属性。但是,在执行从实体到dto的映射时,我遇到了这个问题。我想我知道这在哪里发生,但我不知道如何通过它。 密码 我已经跟踪了当映射器试图映射角色依赖关系时发生的。对象有 中,这不再有效。 有人知道如何避免异常,同时正确映射我

  • 本文向大家介绍详解vue beforeEach 死循环问题解决方法,包括了详解vue beforeEach 死循环问题解决方法的使用技巧和注意事项,需要的朋友参考一下 什么是beforeEach? beforeEach 是一个vue-router的路由导航钩子,一般我用它做路由守卫。 什么是路由守卫? 路由跳转前做一些验证,比如登录验证,是网站中的普遍需求。对此,vue-route 提供的befo

  • 本文向大家介绍详解Spring Bean的循环依赖解决方案,包括了详解Spring Bean的循环依赖解决方案的使用技巧和注意事项,需要的朋友参考一下 如果使用构造函数注入,则可能会创建一个无法解析的循环依赖场景。 什么是循环依赖 循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。如下图: 注意,这里不是函数的循环调用,

  • 我已经在其他项目中多次遇到这个问题。现在我试图理解异常处理,但我仍然不知道它到底是如何工作的。我试图用循环编程一个计算器,当我试图输入字符串时,会出现InputMismatchException-我试图捕捉它,但出于某种原因,在catch子句之后,java给了我另一个InputMismatchException,为什么? 起初有一个无限循环,我用扫描器求解。nextInt() 在catch块内,但

  • 解决方案常见问题 Windows Needing to re-target the Windows SDK XCode XCode PNG Compression issue It is possible that your PNG images contain incorrect color profiles. You can convert color profiles using Image