目录
前言
什么是springBean的循环依赖?相信大家不管是在刚开始学习Spring还是面试都会遇见好多次这些问题,但是有的程序猿猴宝宝还是对这个循环依赖不是很理解,我通俗的解释下:大家都知道,每个国家再想要发射核弹的时候都是需要两把钥匙的,只有一把钥匙的话是发射不了的,一把钥匙必须要依赖另一把钥匙,但是在springBean中的运作过程中,并不支持这种方式,是不支持哦
类似于下面这种情况,最终相当于自己依赖自己,最终形成了闭环,类似于线程死锁的情况
一、实际开发中遇到的循环依赖问题
最近在我在开发的时候遇到一个我们常说的循环依赖问题,也是最简单的一种循环依赖问题,我在A对象中引入了B对象,又在B对象引入了A对象,在启动的时候就会造成下面这种错误
Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'codeAssociationGatewayImpl': Bean with name 'codeAssociationGatewayImpl' has been injected into other beans [relationshipGatewayImpl] 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:1255)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1175)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:521)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:497)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:637)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:180)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:322)
... 42 more
二、问题解决
其实我这里的问题解决很简单,因为我这里B对象引用仅仅是A对象的一个方法,直接把A对象要引用的方法放到B对象中或者其他不需要循环以来的对象中就可以直接解决问题的
因为我这里知道这个循环依赖是因为什么导致的,所以我这里就没有用到其他博客所说的三级缓存来解决,直接通过对业务逻辑的改变来解决其实更方便些
总结
我们在平时编写代码的时候其实不用必须要依赖那些高大上的解决方法,只要是自己对业务非常熟悉,从业务方面上可以真正的解决问题,我觉着就可以了,像这种循环依赖的问题就可以通过这种改变对象中的方法来源来解决,不需要再去通过配置和写复杂的代码来解决!希望可以对一些年轻的猴宝宝有帮助