Ang error sa pabilog na pagpapakandili Ang hiniling na bean ay kasalukuyang nilikha: Mayroon bang isang hindi malutas na reperensya ng pabilog?

Circular Dependency Error Requested Bean Is Currently Creation



ang dahilan

Naranasan ko ang hukay na ito kapag nagtatrabaho sa isang proyekto ngayon, na literal na nagpapalitaw ng isang paikot na pagtitiwala. Dahil gumagamit ako ng injection ng konstruktor, makakakuha ako ng isang error kapag nakatagpo ako ng isang paikot na pagpapakandili. Tulad ng ipinakita sa pigura, ang aking kadena sa pagtitiwala ay bumubuo ng isang loop.
imahe

Bakit hindi gumagana ang injection ng konstruktor

Dahil upang mapagtanto ang paikot na pagpapakandili, kailangan mong tawagan ang B kapag ang A ay tumawag sa A, at kapag ang B ay tumawag sa A muli, ang A ay inilalagay sa singletonFactories na antas ng third-cache nang maaga, kung hindi man ang A at B ay hindi maaaring madiin. Ang paunang kinakailangan para sa pagdaragdag ng singletonFactories na tatlong antas na cache ay upang maipatupad ang tagapagbuo, kaya ang paikot na pagpapakandili na na-injected ng tagabuo ay hindi malulutas, at muling susulat nito ang tagapagbuo. Ang spring source code ay ang mga sumusunod:



// Eagerly cache singletons to be able to resolve circular references // even when triggered by lifecycle interfaces like BeanFactoryAware. //Cache singleton bean objects in the container to prevent circular references boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName)) if (earlySingletonExposure) { if (logger.isDebugEnabled()) { logger.debug('Eagerly caching bean '' + beanName + '' to allow for resolving potential circular references') } //This is an anonymous inner class, in order to prevent circular references, hold object references as soon as possible addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)) } protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) { Assert.notNull(singletonFactory, 'Singleton factory must not be null') synchronized (this.singletonObjects) { if (!this.singletonObjects.containsKey(beanName)) { this.singletonFactories.put(beanName, singletonFactory)//Three level cache this.earlySingletonObjects.remove(beanName) this.registeredSingletons.add(beanName) } } }

solusyon

Tingnan ang tala ng error:



Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'refundSettleRespOneByOneBiz': Requested bean is currently in creation: Is there an unresolvable circular reference?

Pumunta sa klase ng refundSettleRespOneByOneBiz at palitan ang injection ng konstruktor sa setter injection
imahe
Baguhin ang isa sa mga node upang masira ang paikot na dependency ~