A-> B-> Aしばしば存在の場合と同様に、開発プロセス、B、;スプリングソースDefaultSingletonBeanRegistry参照
getSingleton(文字列のbeanName、ブールallowEarlyReference)方法:
/ ** *プロセス思考スプリング循環参照:現在、事前に作成したシングルトンオブジェクトを実行することを許可言及 あなたが循環参照の問題を解決することができますので、完了していない、この時刻を事前に注入シングルトンオブジェクト参照を属性* リターン(生* )シングルトンオブジェクトは、指定された名の下に登録。 * <P>チェック既にインスタンスシングルトンともAN早いためandroid.permission 現在作成シングルトン(循環参照の解決)へ*参考。 *インスタンス化されたシングルトンオブジェクトをチェックし、進歩を可能にシングルトンの現在のリファレンス実装では、(循環参照を解決するために)作成しました。 BEANNAME @paramの名前は*にBeanの表情 でなければなりません作成された* @param allowEarlyReference早期参照するか否か *オブジェクトシングルトン、IF}または{@codeヌルなし@return登録が見つかりました。 * / @Nullable 保護されたオブジェクトgetSingleton(文字列をbeanName、ブールallowEarlyReference){ //見つけるためにシングルトンキャッシュを開始し、最初のBeanが作成されているかどうかを決定する見つけることができませんでした //は、Bean、およびキャッシュBeanの早期の露出を作成し、属性の注入はまだありません循環依存関係を解決するために使用される豆、 isSingletonCurrentlyInCreationが対応するかどうかを判断創造//シングルトンオブジェクトを = SingletonObjectこのObject。SingletonObjectsに.get(のbeanName); IF(singletonObject == NULL && isSingletonCurrentlyInCreation(のbeanName)){ 同期(this.singletonObjects){ //全て単一露光の実施形態は、earlySingletonObjectsから見つけようと予め記憶されearlySingletonObjects singletonObjectこの=。earlySingletonObjectsに.get(のbeanName); IF(&& allowEarlyReference singletonObject == NULL){ //場合は許可され、早期の依存性は、対応する一つの実施形態にsingletonFactoriesから植物を見つけることを試みること 、<?>。=のObjectFactory singletonFactoryこのsingletonFactoriesが(に.get beanName); !IF(singletonFactory = NULL){ singletonObject = singletonFactory.getObject()。 this.earlySingletonObjects.put(のbeanName、singletonObject)。 this.singletonFactories.remove(のbeanName)。 } } } } singletonObjectを返します。 }
説明:
/ **シングルトンはキャッシュの対象:. Beanインスタンス名にBeanを* /
/ * **キャッシュ単一の実施形態豆/
民間最終地図<文字列、オブジェクト> singletonObjects =のConcurrentHashMap <>(256)の新しい新しい;
キャッシュ工場の/ **シングルトン。:のObjectFactoryにBean名* /
/ **シングルトンの工場キャッシュ* /
民間最終地図<文字列、ObjectFactoryに<= >> singletonFactories新しい新しいHashMapの<>(16);?
早期の/ **シングルトンキャッシュはオブジェクト:Bean名をに。Beanインスタンス* /
豆シングルトン/ **キャッシュ早期暴露すなわち、まだ完了していない注入性*豆/
民間最終地図<文字列、オブジェクト> =新しい新しいearlySingletonObjectsのHashMap <>(16);
設定の/ **登録シングルトン、受注登録で、Bean名に含む。* /
プライベート最終セット<文字列>registeredSingletons =新しいLinkedHashSetの<>(256);
getObjectメソッドのObjectFactoryインタフェース()メソッド:
パブリックインターフェースのObjectFactory <T> { / ** *此方法返回被ビーン工厂管理的ビーン的实例 *戻りインスタンス(おそらく共有または独立した) このファクトリによって管理されるオブジェクトの*。 *得られたインスタンスを@return *作成エラーの場合にBeansExceptionを@throws * / TのgetObject()BeansExceptionをスロー。 }
ソリューションの参照をリサイクル:
オブジェクトBは、注入を必要とする場合1 @Autowiredアノテーションを使用して、噴射時間は、オブジェクト属性ばね、Aが露出しているオブジェクトへの参照により決定しました。
属性Bに基づく2セッター注入法