处理循环依赖问题
发布时间: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); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |