レビューBeanDefinitionとBeanの関係。たBeanFactoryコンテナ。ApplicationContextのコンテキスト。
まず、要約:
- Bean開発者は、情報を定義する:定義されたXML形式に分け、注釈は、式で定義されます
- BeabFactoryコンテナを格納することと、豆のApplicationContextは、コレクションを定義しました。
- ビーンたBeanFactoryは、これらのBeanDefinition。私たちの使用するためにキャッシュを作成します。
[开发人员]--标注-->[Bean定义] ---搜集 -->[BeanDefinition]---创建-->[Bean]
このセクションでは:私たちは、コードレベルから、このプロセスを分析しました。
リフレッシュ()
refresh()メソッドは、ほとんどの作業は、豆にプロセスBeanDefinition実行ビーンを定義するためのプロセスを初期化プロセスのApplicationContextを説明しています。
リフレッシュ()という用語は、大きく5つの部分に分けることができます。
準備段階の前に1.BeanDefinitionストレージ:
- prepareRefresh()初期化;:メインの環境属性、チェック。
- obtainFreshBeanFactory();:調製たBeanFactory()(注:XMLコンフィギュレーションフォームBeanは主記憶を集めるこの時点で実行されます)
- prepareBeanFactory(たBeanFactory);クラスをロード含めたBeanFactory構成情報、クラスローダ、リゾルバは、無視される必要がある環境関連Beanを作成するために、依存初期Beanクラスのプロセッサに依存します
- postProcessBeanFactory(たBeanFactory);限り、ウェブ型の構成の相関特性たBeanFactoryコンテキストを増加させるための方法として。
この段階の合計は、設定たBeanFactoryをしていました。
2.BeanDefinition収集蓄積段階:
- invokeBeanFactoryPostProcessors(たBeanFactory):このメソッドは、主にない注釈型BeanDefinitionの集まりである、これらのBeanDefinition、実行BeanFactoryPostProcessor.postProcessBeanFactory()メソッドを登録し、記憶装置の動作を変更します。
このプロセスは非常に微妙です。すべての責任PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors()によって、
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors上の()メソッドの性質は、二つのことを行っているでしょう:
- 登録型BeanFactoryPostProcessorを実行:この時点で、重要なConfigurationClassPostProcessorレジストラがあり、このような構成は、注釈型BeanDefinitionは見つけてたBeanFactoryに登録します。
- BeanFactoryPostProcessorの一般的なタイプの実装:ストレージの動作に変更を加えます。
事前に作成された特別な機能の豆3.一部:
使用するためBeanDefinitionビーンを作成するための特別な使用の少数のこの段階。
- registerBeanPostProcessors(たBeanFactory); BeanPostProcessorのいくつかの例は、ビーンBeanDefinitionを生成する将来の準備します。。
- initMessageSource();初期のApplicationContext国際関連コンポーネントビーン、メッセージ・バインディング、メッセージ解析
- initApplicationEventMulticaster();:初期放送成分豆、初期化ステージイベント中の放送のために。
- OnRefresh();サブクラス特別な初期化豆(拡張ポイントと考えることができます)
- registerListeners();:行くために放送局に提供されるコンテナリスナー豆、。
4.普通BeanDefinitionは、Bean相生成
この段階の大部分をBeanDefinitionビーンステージを生成することです。
finishBeanFactoryInitialization(たBeanFactory):
このプロセスは、物品である、前記のApplicationContextコンテクストトリガーBeanDefinition内部たBeanFactoryはビーンを作成します。、その後、スタートスイッチが豆を生産押されるように、豆の生産プロセスは、パイプラインである、ここで.ApplicationContextを製造するためのスタートスイッチを押すと、BeanDefinitionにパイプラインを最初に供給する最初のマシン:私たちは、シナリオを想像してみてください。最後に豆を得るために、異なる方法で処理原料のためのマシンのさまざまな種類があります
ApplicationContextのコールDefaultListableBeanFactory.preInstantiateSingletonsは()豆の作成をトリガするために始めました:
doGetBean:
- この倉庫は、Beanが作成されているかどうかをまずチェックが、そこに取り出されます
- Beanを作成するためにパイプラインを取る準備ができていない作成しました。
- そこに材料の前にチェックを作成しますか?現在、ビーンの作成をマークし、あります
- はい、負荷に依存Beanを作成するために行く、依存性を確認してください。戻る1へ
- スコープ、実行のための準備ができたcreateBean()パイプラインの分析。
doGetBean->したcreateBean:
- 豆は、クラスのクラスをロード
- カバーされる準備と検証方法
doGetBean-> createBean->プロキシオブジェクト:リターン・プロキシー
- プロキシオブジェクトを作成します。BeanPostProcessorsに(代わりに、実際の例のプロキシオブジェクトを返すチャンスビーンのカスタムTargetSourceのためにここに戻るには)
doGetBean-> createBean-> doCreateBean:プロキシオブジェクトが続くカスタムを作成しないでください
- 適切な例戦略はビーン(ファクトリメソッド、コンストラクタ自動注射、単純な初期化)を作成するために使用され、オブジェクトはBeanWrapperビーンラッパークラスを得ました。
- BeanDefinitionPostProcessorポストプロセッサを呼び出し、BeanDefinitionを変更
- 他のオブジェクトが彼に参照できるように、溶液は、すぐにキャッシュに可能な参照として豆を暴露された:循環依存Singletonパターンを解決します
- Beanプロパティの設定populateBean
- initializeBean:
doGetBean-> createBean-> doCreateBean-> initializeBean实例化ビーン
- invokeAwareMethods:実行方法の_awreタイプ
- applyBeanPostProcessorsBeforeInitialization事前メソッドの実装BeanPostProcessor
- invokeInitMethods:InitializingBeanインタフェースafterPropertiesSet、invokeCustomInitMethod、カスタマイズのinitメソッドの方法を実行する実行
- applyBeanPostProcessorsAfterInitialization:BeanPostProcessorを行う方法の後
- ビーンが返される。この時点で、豆の生産工程へのBeanDefinitionが完了しました。
5.applicationContext仕上げ段階
finishRefresh();
実際の最終段階は、ApplicationContextのの拡張ポイントと考えることができます。ライフサイクル・インターフェース・ライフサイクル・インターフェースその後、DefaultLifecycleProcessor.LifecycleProcessorがLifecycleProcessorがBeanライフサイクル・インターフェースを処理するために使用されていますか?でやっているデフォルトを作成していない場合(1.まず、BeanのBeanコンテナLifecycleProcessorタイプから取得します。
(2.ライフサイクルインタフェースのLifecycleProcessorの実行を得ることはBeanのstart()メソッドを実装します
(3.初期化イベントの完了のコンテキストを公開します
アクティブな場合(LiveBeansView MBean内4.Participateは、なぜは非常に明確ではありません。
Beanのライフサイクル
refresh()メソッドを読んだ後。私たちは豆のライフサイクルを要約してみましょう。
それは絵で表され、
Beanの完全なライフサイクルは、4つのフェーズに分かれています。
第一段階:インスタンス化する段階。
豆はBeanDefinition注文するストレージの定義の実装から収集
BeanDefinitionRegistryPostProcessor登録プロセッサは、いくつかのBeanDefinitionレジスタ
記憶BeanDefinitionを定義するために、BeanFactoryPostProcessorを変更します。
BeanWrapper世代、BeanWrapperはビーンの初期の製品です。
セットは、()の実行がpopulateBean属性
概要:このステージはBeanDefinition-> BeanWrapper、さまざまなプロパティを設定されています第二段階:初期化フェーズ:主に様々な初期化メソッド実行
invokeAwareMethods(のbeanName、豆);アウェア実行属性の設定を。
BeanPostProcessor.postProcessBeforeInitializationは、方法の前に実行
実現InitializingBean.afterPropertiesSet()このメソッドが実行された場合
、カスタマイズにinitMethod方法を実行します。
ポストBeanPostProcessor.postProcessBeforeInitializationを行う方法、第三段階:フェーズ
バッファ容器から取り出した豆getBeanフェーズIV:破壊段階
DisposableBean.distroy方法を実行するための
カスタムdetry-方法を実行します
要約:
全体スプリングの初期化プロセスは、以下のように見ることができます
- 材料(BeanDefinition)コレクションストレージ(たBeanFactory)
- ライン完成品を作成するために除去(getBean())材料(豆)
- 完成(豆)ストレージ(たBeanFactory)
私は公共の行動のみんなの注目番号[ソース]、最新の個人的な理解タイムリーなプロモーションを歓迎します。