スプリングはどうやって循環依存を解決しますか?なぜキャッシュを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を実例化します.この方法は次の通りです.
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を呼び出します.これによって、対象の引用を事前に取得する時に、いくつかの操作ができます.