記一次循環(huán)依賴問(wèn)題

什么是循環(huán)依賴?

BeanA依賴BeanB,BeanB依賴BeanA。
以此類推
BeanA依賴BeanB,BeanB依賴BeanC,BeanC依賴BeanA。

項(xiàng)目中沒(méi)有使用構(gòu)造器注入的方式。理論上不會(huì)出現(xiàn)循環(huán)依賴。

public class appUserService {
   @Autowired
   private BalanceCashOutJobService balanceCashOutJobService;

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

出現(xiàn)報(bào)錯(cuò)

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

解決

經(jīng)過(guò)排查,在configuration配置類里使用了 BeanPostProcessor

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

參考
http://www.itdecent.cn/p/f17882274dda?from=timeline&isappinstalled=0

BeanPostProcessor接口是用來(lái)對(duì)bean進(jìn)行后置處理的,這個(gè)時(shí)候bean已經(jīng)完成實(shí)例化和依賴注入了,屬于bean初始化生命周期的一部分。
當(dāng)有循環(huán)依賴出現(xiàn)時(shí),Bean中注入的bean不是最終的版本,而是spring 三級(jí)緩存中的第二級(jí)緩存引用。然而這個(gè)引用在完成bean注入后將發(fā)生改變。導(dǎo)致注入的bean跟最終生成的bean不是同一個(gè)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容