实际开发解决SpringBean对象循环依赖问题(简单)Error creating bean with name ‘codeAssociationGatewayImpl‘: Bean with na

文章介绍了在Spring框架中遇到的循环依赖问题,通过一个核弹发射钥匙的比喻解释了这个问题的本质。作者在实际开发中遇到A对象依赖B对象,B对象又依赖A对象的情况,导致BeanCurrentlyInCreationException。解决方法是通过调整业务逻辑,将其中一个对象引用的方法移出,避免循环依赖。作者强调,熟悉业务并从逻辑层面解决问题往往比使用复杂的技术解决方案更有效。
摘要由CSDN通过智能技术生成

目录

前言

一、实际开发中遇到的循环依赖问题

二、问题解决

总结


前言

          什么是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对象中或者其他不需要循环以来的对象中就可以直接解决问题的


 因为我这里知道这个循环依赖是因为什么导致的,所以我这里就没有用到其他博客所说的三级缓存来解决,直接通过对业务逻辑的改变来解决其实更方便些

总结

        我们在平时编写代码的时候其实不用必须要依赖那些高大上的解决方法,只要是自己对业务非常熟悉,从业务方面上可以真正的解决问题,我觉着就可以了,像这种循环依赖的问题就可以通过这种改变对象中的方法来源来解决,不需要再去通过配置和写复杂的代码来解决!希望可以对一些年轻的猴宝宝有帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值