春5.xのソース・旅行三〇から四getBean循環依存関係ソリューション

春の5.xのソース・旅行三〇から四getBeanは、循環依存関係の一つの事件を解決します

循環依存フローチャートソリューション

循環依存関係の下で見ては、ライトを解決する方法のフローチャートです。

ここに画像を挿入説明

ソリューション

単にオブジェクトの最初のインスタンスがあり、置くAコレクションに保存され、[プロパティ]を記入し、彼の依存オブジェクトの例B依存オブジェクトがあれば、Bまた依存しているAがされたかどうかを調べるために、この時点でコレクションのインスタンスに、A有することを見出しA取り出す意志を与えるB完全に充填性、及びその後Bを、その後Bも充填Aも完了。実際には、原則としては、非常に簡単で、他の依存関係を避けるために、それを置く場所を見つけることです、それらに依存することを取り出してきました。
ここに画像を挿入説明

キーの方法のいくつか

インスタンスが作成された後、この方法は、あなたがしたい、つまり、呼び出されるObjectFactoryまで保存singletonFactoriesコレクション、次の呼び出しを取り出すことができるgetObjectインスタンスを取得します。

	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);//放进单例工厂里
				this.earlySingletonObjects.remove(beanName);//删除早期单例
				this.registeredSingletons.add(beanName);//添加到已注册
			}
		}
	}

ObjectFactoryそれは書かれていたlambda表現を。
ここに画像を挿入説明

getEarlyBeanReference

内部には、実際に彼らはプロパティはここで行うに充填することができる前に行われた変更をしたい場合は、拡張することができ、内部プロセッサは、しないだろうプロセッサによって処理されるが、プロパティを充填する前にプロセッサを拡張する方法があります。

	protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
		Object exposedObject = bean;
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
					SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
					exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
				}
			}
		}
		return exposedObject;
	}

getSingleton

ここで重要なのは、それが作成されている場合、それはすることができ、循環参照を解決することでObjectFactory取得し、呼び出すgetObjectメソッドはそれらに依存オブジェクトの前に取得することができます。A、作成入れるsingletonFactoriesには、頼りにBB作成し、頼りにしてA、Aから取得するには、この時間時間ができるsingletonFactoriesで取得した後、決意循環依存関係で満たされているに依存しています。

@Nullable
	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);//从singletonFactories获取出来,放进去
						this.singletonFactories.remove(beanName);
					}
				}
			}
		}
		return singletonObject;
	}

さて、今日ここに、私たちは自分自身の学習、限られた容量を理解し、偉大な神は見スプレーしないで、言い訳してください、助けの調査に希望と理解しています。

公開された235元の記事 ウォン称賛74 ビュー30000 +

おすすめ

転載: blog.csdn.net/wangwei19871103/article/details/105165501