美文网首页
记一次循环依赖问题

记一次循环依赖问题

作者: SteveLaw1124 | 来源:发表于2020-08-14 16:03 被阅读0次

什么是循环依赖?

BeanA依赖BeanB,BeanB依赖BeanA。
以此类推
BeanA依赖BeanB,BeanB依赖BeanC,BeanC依赖BeanA。

项目中没有使用构造器注入的方式。理论上不会出现循环依赖。

public class appUserService {
   @Autowired
   private BalanceCashOutJobService balanceCashOutJobService;

  @Autowired
  private DistributionPersonnelService distributionPersonnelService;
......
代码略
}

出现报错

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'appUserService': Bean with name 'appUserService' has been injected into other beans [balanceCashOutJobService,distributionPersonnelService] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:622)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1248)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1168)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593)
    ... 45 common frames omitted

解决

经过排查,在configuration配置类里使用了 BeanPostProcessor

@Bean
    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();
    }

参考
https://www.jianshu.com/p/f17882274dda?from=timeline&isappinstalled=0

BeanPostProcessor接口是用来对bean进行后置处理的,这个时候bean已经完成实例化和依赖注入了,属于bean初始化生命周期的一部分。
当有循环依赖出现时,Bean中注入的bean不是最终的版本,而是spring 三级缓存中的第二级缓存引用。然而这个引用在完成bean注入后将发生改变。导致注入的bean跟最终生成的bean不是同一个。

相关文章

  • 记一次循环依赖问题

    什么是循环依赖? BeanA依赖BeanB,BeanB依赖BeanA。以此类推BeanA依赖BeanB,BeanB...

  • 循环依赖问题

    问题描述 有多个对象,A依赖B,B依赖A。导致实例化的时候会进入死循环导致内存溢出。 三种循环依赖 1.构造器的循...

  • Spring高频面试题:如何解决循环依赖问题

    循环依赖问题全景图 什么是循环依赖问题? 类与类之间的依赖关系形成了闭环,就会导致循环依赖问题的产生。 比如下图中...

  • Spring解决循环依赖

    Spring当中的循环依赖问题是面试中经常提及的,这一次我们就来聊一聊这个问题。首先,循环依赖其实指的就是多个类之...

  • spring循环依赖问题

    使用spring boot 进行bean内方法循环依赖问题的研究,简单来说就是TestA.test()依赖Test...

  • Spring循环依赖问题

    https://gavinzhang1.gitbooks.io/spring/content/xun_huan_y...

  • Spring循环依赖问题

    循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循...

  • spring循环依赖问题

    1、问题描述循环依赖的场景举例,如下两个类,就产生了相互依赖,那么初始化的时候,spring是怎样做的呢?@Com...

  • IOC循环依赖问题

    转自知乎 加耀

  • Spring循环依赖问题

    什么是循环依赖 循环依赖就是两个对象之间存在相互依赖的关系; Spring是如何解决循环依赖的 Spring使用三...

网友评论

      本文标题:记一次循环依赖问题

      本文链接:https://www.haomeiwen.com/subject/yuggdktx.html