加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

处理循环依赖问题

发布时间:2020-12-14 05:03:00 所属栏目:百科 来源:网络整理
导读:1. 循环依赖类别 1)构造参数依赖:无解 2)属性依赖:对多实例Bean无解,对单实例Bean采用earlySingletonExposure策略 ? 2. DefaultListableBeanFactory参考 1)创建Bean:createBean --?doCreateBean protected Object doCreateBean( final String beanNam

1. 循环依赖类别

1)构造参数依赖:无解

2)属性依赖:对多实例Bean无解,对单实例Bean采用earlySingletonExposure策略

?

2. DefaultListableBeanFactory参考

1)创建Bean:createBean -->?doCreateBean

protected Object doCreateBean(final String beanName,final RootBeanDefinition mbd,final Object[] args) throws BeanCreationException {
    ...
    boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName));
    if (earlySingletonExposure) {
        ...
        addSingletonFactory(beanName,new ObjectFactory<Object>() {
            @Override
            public Object getObject() throws BeansException {
                return getEarlyBeanReference(beanName,mbd,bean);
            }
        });
    }

    Object exposedObject = bean;
    try {
 populateBean(beanName,instanceWrapper); if (exposedObject != null) {
            exposedObject = initializeBean(beanName,exposedObject,mbd);
        }
    }
    ...

    return exposedObject;
}

protected void addSingletonFactory(String beanName,ObjectFactory<?> singletonFactory) {
    ...
    synchronized (this.singletonObjects) {
        if (!this.singletonObjects.containsKey(beanName)) {
            this.singletonFactories.put(beanName,singletonFactory);  this.earlySingletonObjects.remove(beanName); this.registeredSingletons.add(beanName);
        }
    }
}

?

2)获取Bean:getBean -->?doGetBean

protected <T> T doGetBean(final String name,final Class<T> requiredType,final Object[] args,boolean typeCheckOnly) throws BeansException {
    ...
 Object sharedInstance = getSingleton(beanName); if (sharedInstance != null && args == null) {
        ...
    }

    else {
        ...
    }

    return (T) bean;
}

protected Object getSingleton(String beanName,boolean allowEarlyReference) {
    Object singletonObject = this.singletonObjects.get(beanName);
    if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
        synchronized (this.singletonObjects) {
            singletonObject = this.earlySingletonObjects.get(beanName);
            if (singletonObject == null && allowEarlyReference) {
 ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName); if (singletonFactory != null) {
                    singletonObject = singletonFactory.getObject();
                    this.earlySingletonObjects.put(beanName,singletonObject);  this.singletonFactories.remove(beanName);                 }
            }
        }
    }
    return (singletonObject != NULL_OBJECT ? singletonObject : null);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读