春の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
には、頼りにB
、B
作成し、頼りにして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;
}
さて、今日ここに、私たちは自分自身の学習、限られた容量を理解し、偉大な神は見スプレーしないで、言い訳してください、助けの調査に希望と理解しています。