レジャールックspringIOCのソースコードを、少しずつでてきます。
バージョン
springboot-2.1.3(バネ5.1.5)
< 親> < groupIdを> org.springframework.boot </ groupIdを> < たartifactId >春・ブート・スターター・親</ たartifactId > < バージョン> 2.1.3.RELEASE </ バージョン> </ 親> ... < 依存関係> < groupIdを> org.springframework.boot </ groupIdを> < たartifactId >春・ブート・スターター・ウェブ</ たartifactId > </依存関係>
二、IOCの容器本体の初期化コード
様々なApplicationContextのリフレッシュ()メソッドの実装のコアロジックIOCコンテナの初期化。
/ * 遅延サブクラス特定の実装に抽象親クラス、メソッドのトップレベルの定義のテンプレートメソッドパターン* / / * org.springframework.context.support.AbstactApplicationContext * / 公共 ボイドリフレッシュ()スローBeansException、{IllegalStateExceptionが 同期(これを。 startupShutdownMonitor){ // このコンテキストをリフレッシュするための準備。 prepareRefreshは(); // 。ビーンファクトリーへサブクラス内部リフレッシュ教える ConfigurableListableBeanFactoryたBeanFactory = obtainFreshBeanFactory(); // この文脈で使用するためにビーンザ・ファクトリーを準備します。 prepareBeanFactory(たBeanFactory)。 試す{ //は、コンテキストサブクラスでビーンファクトリの後処理を可能にします。 postProcessBeanFactory(たBeanFactory)。 // 呼び出し工場プロセッサコンテキスト内でBeanとして登録。 invokeBeanFactoryPostProcessors(たBeanFactory)。 // そのインターセプト豆の作成登録豆プロセッサ。 registerBeanPostProcessors(たBeanFactory)。 // このコンテキストの初期化メッセージソース。 initMessageSource(); // このコンテキストの初期化イベントマルチキャスタ。 initApplicationEventMulticaster(); //特定のコンテキストのサブクラス中の他の特別な豆を初期化します。 onRefresh(); // リスナー豆をチェックし、それらを登録します。 registerListeners(); // インスタンス化のすべての残りの(非レイジーINIT)シングルトン。 finishBeanFactoryInitialization(たBeanFactory)。 // 最後のステップ:対応するイベントを公開します。 finishRefresh(); } キャッチ(BeansException EX){ 場合(logger.isWarnEnabled()){ logger.warn( "コンテキストの初期化中に発生した例外- " + "リフレッシュ試行をキャンセル:" +EX); } // リソースをダングリングを避けるために、既に作成したシングルトンを破壊します。 destroyBeans(); // 「アクティブ」フラグをリセットします。 cancelRefresh(EX); // 呼び出し側に伝播する例外。 スローEXを。 } 最後に{ // Springのコア内のリセット、共通のイントロスペクションのキャッシュを、我々以来 //は今までもうシングルトンBeanのメタデータを必要としないかもしれません... resetCommonCaches(); } } }
springbootのデフォルト開始AnnotationConfigServletWebServerApplicationContext研究リフレッシュ()の実装ロジックを選択します。
三、AnnotationConfigServletWebServerApplicationContext
①ロック
新スキルが取得:によって実装されて同期きめ細かいロック。それは持っている ReentranLock.lock()、アンロックを解除しない、きめの細かいです()。
公共 のボイドリフレッシュ()スローBeansExceptionは、IllegalStateException { // プライベート最終的なオブジェクトstartupShutdownMonitor; // コンストラクタ=新しい新しいオブジェクトthis.startupShutdownMonitorを(); //定義された現在の排他ロックのApplicationContextインスタンスが同期(この.startupShutdownMonitor){ 。 ... } }