円形の基準初期段階から自然に不可分スプリングビーン初期化といえば、
第1のばね容器がたBeanFactory、起動後に新しいDefaultListableBeanFactoryを作成します。
2リフレッシュ方法と、この方法では中国共産党のコアを呼び出す春のコンテナ内のプロセスを開始するには、9つのメソッドを呼び出し、初期プロセスの春のコンテナであるので、そのマップの私たちの狭い概念春のコンテナだけではなく、単純な、でそうこの方法は、ほとんどの主要な方法のうちの2つから構成されています。
2.1 invokeBeanFactoryPostProcessors(たBeanFactory)
この方法では、豆のJavaClass後に登録されるように収集されたすべての情報をスキャンしたBeanFactory後処理ばねbeanDefinitionMapのレジスタは、将来のビーンの初期化のために提供した後、BeanDefinitionを構築することであるコール情報。
2.2 finishBeanFactoryInitialization(たBeanFactory)
さらに、余分な重要preInstantiateSingletonsを呼び出します。この方法の最終段階である、このプロセスで試作品ので、我々は単一のBeanのスコープを初期化する必要がある、とあなたが別々に処理プロトタイプBeanを行う必要はありませんことは明らかです豆初期化段階または相を直接注入「オブジェクトまたはプロキシオブジェクト」を作成しているかどうか
doGetBean法と呼ばれるデリゲートモデルを使用した後getBean方法preInstantiateSingletons法と呼ばれるが、。doGetBean方法は二回getSingletonメソッドと呼ばれ、3つのキャッシュマップ(singleObjectMap、singletonFactory、earlySingleObjects)の後に 、 2つのコールの性質は、循環参照の問題を解決することで、循環参照が存在しない場合、彼らは方法がcreatBeanを呼び出し指示しますので、豆の作成プロセスで行きます。
再度、最初のコールgetSingleton直接指定循環参照が真である場合、第二getSingleton方法を入力、
(1)良好な豆Beanオブジェクトを作成するために、バッファプールの開始を取得するが、失敗を取得する必要がありますライフサイクルの作成プロセスを完了せずに豆ので。
ちょうど豆はまだそれを得ることができない「状態を作成する」としてマークされていないことを初めて作成したとして、(2)は、earlySingletonObject地図からキャッシュのために行くだろう。
2つの失敗した獲得は、オブジェクトを作成する実際のプロセスに行くにしたcreateBeanによってラムダ式の方法、第三のgetSingleton法と呼ばれる、重要なリンクたcreateBean初期Beanの現在の状態で実行する前に存在した後、(3)それは「コレクションの状態を作成する」に追加され、singletonFactoriesMapキャッシュセットにビーンファクトリを作成する必要がありましたされています。
パブリックオブジェクトgetSingleton(文字列のbeanName、ObjectFactoryに<?> singletonFactory){ Assert.notNull(のbeanName、 " 'のbeanNameは' nullであってはなりません" )。 地図VAR3は = この.singletonObjectsを。 同期(この.singletonObjects){ オブジェクトsingletonObjectは = この.singletonObjects.get(のbeanName)。 もし(singletonObject == nullの){ 場合(この.singletonsCurrentlyInDestruction){ スロー 新しいですBeanCreationNotAllowedException(のbeanNameは、「この工場のシングルトンが破壊している間にシングルトン豆の作成が許可されていません(destroyメソッドの実装でたBeanFactoryからBeanを要求しません)!」); } であれば(この.logger.isDebugEnabled()){ この .logger.debug( "シングルトンビーンの共有インスタンスを作成'" +のbeanName + "'" )。 } この.beforeSingletonCreation(のbeanName)。 ブール newSingleton = 偽 ;
保護された 無効beforeSingletonCreation(文字列のbeanName){ 場合(!この .inCreationCheckExclusions.contains(のbeanName)&&!この.singletonsCurrentlyInCreation.add(のbeanName)){ スロー 新しいBeanCurrentlyInCreationException(のbeanNameを)。 } }
図3は、依然としてたcreateBean方法モードを委託することによってdoCreateBeanメソッドをコールし続け、doCreateBean方法は、2つのコアメソッドがあります。
3.1のcreateInstanceは、Javaクラス自体wapperオブジェクトを作成します。
もし(instanceWrapper == NULL ){ instanceWrapper = この.createBeanInstance(のbeanName、MBD、引数)。 }
3.2 populateBean方法はビーンが注釈付きでオブジェクトのメンバ変数が注入されているパッケージ化されます
繰り返したcreateBean一連の実装前に、この時間はgetBeanメソッドを呼び出すしていきます、アセンブリオブジェクトautowireノートに移動し、再度getSingletonメソッドを呼び出します。この方法では操作。
それは循環依存関係が発生することに留意すべきである。この時点で、対象物の注入特性は、まだ元のターゲットを保持しますが、元のオブジェクトになる二度目getSingleton方式と呼ばれるとき、彼らはすでに二次キャッシュsingleFactoryMap、およびインスタンス化ビーンを通じて工場に得ることができますオブジェクトを取得するように、earlySingleObjectMap 3つのキャッシュに置きます。このような循環依存関係サイクルは、無限ループが作成されることはありません。(AOPが発生した後に、プロキシオブジェクトまたはオブジェクト増強される場合、植物の二次キャッシュ、元の効果に戻ることができる、本質的に、結果は、ポストプロセッサBeanによって行われます)
保護された ボイドpopulateBean(文字列のbeanName、RootBeanDefinition MBD、BeanWrapper BW){ PropertyValues PVS = mbd.getPropertyValues()。 もし(BW == nullの){ 場合(! ((PropertyValues)PVS).isEmpty()){ スロー 新しい BeanCreationExceptionを(、mbd.getResourceDescription()のbeanName、 "ヌルインスタンスにプロパティ値を適用することはできません" ); } } 他{ ブール continueWithPropertyPopulation = 真。 もし(!mbd.isSynthetic()&& この.hasInstantiationAwareBeanPostProcessors()){ イテレータvar6= この.getBeanPostProcessors()反復子()。 一方、(var6.hasNext()){ BeanPostProcessor BP = (BeanPostProcessor)var6.next(); もし(BP のinstanceof InstantiationAwareBeanPostProcessor){ InstantiationAwareBeanPostProcessor IBP = (InstantiationAwareBeanPostProcessor)BP。 もし(!ibp.postProcessAfterInstantiation(bw.getWrappedInstance()、のbeanName)){ continueWithPropertyPopulation = 偽; 休憩; } } } } もし{(continueWithPropertyPopulation) 場合(mbd.getResolvedAutowireMode()== 1 || mbd.getResolvedAutowireMode()== 2 ){ MutablePropertyValues newPvs = 新しいMutablePropertyValues((PropertyValues)PVS)。 もし(mbd.getResolvedAutowireMode()== 1 ){ この.autowireByName(のbeanName、MBD、BW、newPvs)。 } であれば(mbd.getResolvedAutowireMode()== 2 ){ この.autowireByType(のbeanName、MBD、BW、newPvs)。 } PVS = newPvs。 } ブール hasInstAwareBpps = この.hasInstantiationAwareBeanPostProcessors()。 ブール needsDepCheck = mbd.getDependencyCheck()!= 0 ; もし(hasInstAwareBpps || needsDepCheck){ のPropertyDescriptor [] filteredPds = この.filterPropertyDescriptorsForDependencyCheck(BW、mbd.allowCaching)。 もし(hasInstAwareBpps){ イテレータvar9 = この.getBeanPostProcessors()反復子()。 一方、(var9.hasNext()){ BeanPostProcessor BP = (BeanPostProcessor)var9.next(); もし(BP のinstanceof InstantiationAwareBeanPostProcessor){ InstantiationAwareBeanPostProcessor IBP = (InstantiationAwareBeanPostProcessor)BP。 PVS =ibp.postProcessPropertyValues((PropertyValues)PVS、filteredPds、bw.getWrappedInstance()、のbeanName)。 もし(PVS == NULL ){ リターン。 } } } } もし(needsDepCheck){ この.checkDependencies(のbeanName、MBD、filteredPds、(PropertyValues)PVS)。 } } この.applyPropertyValues(のbeanName、MBD、BW、(PropertyValues)PVS)。 } } }
コールバック関数への呼び出し属性組立3.3 initializeBeanメソッド呼び出しインタフェースはBeanの実装された後、豆は、ポストプロセッサ方式のシリーズです。
保護されたオブジェクトinitializeBean(最終文字列のbeanName、最終オブジェクトBean、RootBeanDefinitionのMBD){ 場合(System.getSecurityManager()!= nullの){ AccessController.doPrivilegedの(新たPrivilegedAction <オブジェクト> (){ パブリックオブジェクトの実行(){ AbstractAutowireCapableBeanFactory。これを。 invokeAwareMethods(のbeanName、豆); 戻り NULL ; } }、この.getAccessControlContext())。 } 他{ この.invokeAwareMethods(のbeanName、豆)。 } オブジェクトwrappedBean= ビーン。 もし(MBD == NULL ||!mbd.isSynthetic()){ wrappedBean = この.applyBeanPostProcessorsBeforeInitialization(豆、のbeanName)。 } 試みる{ この.invokeInitMethods(のbeanName、wrappedBean、MBD)を、 } キャッチ(Throwableをvar6){ スロー 新しい BeanCreationException(MBD =!ヌル mbd.getResourceDescription():?ヌル、のbeanName、 "初期化メソッドの呼び出しが失敗しました" 、var6を)。 } であれば(MBD == NULL ||!mbd.isSynthetic()){ wrappedBean =この.applyBeanPostProcessorsAfterInitialization(wrappedBean、のbeanName)。 } 戻りwrappedBeanと、 }