スプリングはどうやって循環依存を解決しますか?なぜキャッシュを3つ作りますか?
2214 ワード
springはどのように1例の循環依存注入を解決しますか?まず次の3つのキャッシュを見ます.私たちはこのbeanを取得する時、beanPostProcessorのgetEarlyReferenceを呼んで、beanを事前に獲得する必要な操作をします.3.singleton Factores:私がちょうど実用化したbeanを預けて、Object Factoryを通じて、事前に必要なbeanがあれば、このObject factoryを呼び出すことができます.その場合は、実行されたばかりのbeanをbeanPostProcessorのget EarlyReference処理を経て戻すことができます.
まず実用化Aを実施し、実用化したらaddSingleton Factoryを呼び出す.()->getEarlyBenReference(beanName,mbd,bean)は、Object Factoryの匿名クラスを実現します.そして、属性を設定すると、私たちはまだBに依存していることが分かります.そこで、Bを実例化します.この方法は次の通りです.
まず実用化Aを実施し、実用化したらaddSingleton Factoryを呼び出す.()->getEarlyBenReference(beanName,mbd,bean)は、Object Factoryの匿名クラスを実現します.そして、属性を設定すると、私たちはまだBに依存していることが分かります.そこで、Bを実例化します.この方法は次の通りです.
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
singletonObjects bean
Object singletonObject = this.singletonObjects.get(beanName);
, A , earlySingletonObjects
earlySingletonObjects
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
bean , ,
,
synchronized (this.singletonObjects) {
earlySingletonObjects
singletonObject = this.earlySingletonObjects.get(beanName);
EarlyReference
if (singletonObject == null && allowEarlyReference) {
objectfactory, objectfactory
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
() -> getEarlyBeanReference(beanName, mbd, bean),
earlySingletonObjects,
singletonObjects, ,
ObjectFactory> singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return singletonObject;
}
これは、以前にAをsingleton Factoresに預けておけば、BはそれをAirySingleton Objectに入れて、それから全体の一例はsingleton Objectに作成されます.singleton Factoresに保管すると、利点は拡張できます.私たちはこの中でbeanPostProcessorを呼び出します.これによって、対象の引用を事前に取得する時に、いくつかの操作ができます.