それは、再び長い時間のためのダボコードの前に、個人は怠け者です読んで、私はノートをまとめて取ることはありません、多くの人が忘れてしまいました。最近時間が慎重に次のソースレコードの要約、深い印象を研究します。
環境:
ソース・バージョン:2.7.3-SNAPSHOT
IDE:アイデアIntelij
クラスExtensionLoader 1.拡張メカニズム
ダボマイクロカーネル拡張+優れたデザインを使用したデザインは、JDK ServiceLoader機構の拡張ポイントで描画し、コアの実装がExtensionLoader.class内にある、読むために、このクラスを理解し、デバッグコードが重要です。
次のようにExtensiionLoaderクラスのメンバ変数は以下のとおりです。
// ===============基本データ=============== プライベート文字列cachedDefaultName、SPIの//デフォルトの拡張子名 <?>民間最終クラスタイプ; //現在ロードされているSPIクラスの種類 民間最終ExtensionFactoryのObjectFactory; SPI //(セットオブジェクトのメソッド)プロパティを注入するためのオブジェクトの工場拡張拡張 //クラスのキャッシュ== ========= ======= プライベート揮発性cachedAdaptiveClass = nullのクラス<?>; ?民間最終ホルダー<地図<文字列、クラス<= >>> cachedClasses新しい新しいホルダー<>(); プライベート設定<クラス<>> cachedWrapperClasses ?; //ワープ拡張クラスのコレクション。現在の拡張のための拡張コンストラクタのパラメータの型が、この拡張機能が型をラップする場合は 、// ==========インスタンスキャッシュ================= プライベート最終ホルダー<OBJECT> cachedAdaptiveInstance =新しいホルダー<>(); //適応キャッシュされたインスタンス 民間最終のConcurrentMap <文字列、ホルダー<オブジェクト>> cachedInstances =新しいのConcurrentHashMap <>(); // 生成された拡張キャッシュされたインスタンス / /(ExtensionFactory除く)各ExtensionLoaderは依然として拡張機構の負荷を使用して、工場が必要 民間最終地図<文字列、オブジェクト> cachedActivates =新しいのConcurrentHashMap <>(); //アクティブ扩展实例缓存 // =============运行时产生内容============= 民間最終のConcurrentMap <クラス<?>、文字列> cachedNames =新規のConcurrentHashMap <>(); //缓存的扩展点クラス-名称映射 プライベート揮発性のThrowable createAdaptiveInstanceError。 プライベート地図<文字列は、IllegalStateException>例外=新しいのConcurrentHashMap <>(); プライベートExtensionLoader(<?>クラスタイプ){ this.type =タイプ。 ObjectFactory =(タイプ== ExtensionFactory.classヌル:ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension())。 }
データベース、クラス・キャッシュ、インスタンスキャッシュ、実行時に生成されたデータの他の4種類にメンバ変数。
loadClass()メソッドで達成すべての拡張を介して実行loadExtensionClasses()メソッド、
拡張子はのラップ延長を達成するために、適応共通に分割されます。
例えば1まで(そうでない場合は、自動的に生成されたときにコールgetAdaptiveExtension())適応注釈と上記クラスの1適応拡張、、、:AdaptiveExtensionFactoryクラス
2.通常の拡張、具体拡張ポイントは、例えば、DubboProtocolプロトコル拡張を拡張しました。
3.ラップ伸長、拡張の種類、拡張子がコンストラクタ点を有する例えばProtocolFilterWrapperプロトコルが拡張され、コンストラクタ、パラメータプロトコルタイプがあります。ラップ拡張は、共通の拡張子を生成するときにサイクルが再び再び、パッケージ全体をクラスをラップする、通常のパッケージの拡張です。
2. 重要な方法:
getAdaptiveExtension()とgetActivateExtension():ExtensionLoader 2つの重要な方法があります。
getAdaptiveExtension:
適応拡張ラッパー(プロキシ)クラスであり、それは最終的なコールの実際の膨張を決定するために、ランタイム内のURLの値に基づいてキー値を通過します。
次のように内部ロジックは以下のとおりです。
メンバ変数を直接Class.newInstanceと、値adaptiveClassを有する場合()一例アウト、
値なした場合、コンパイラコンパイラは、適応型のインスタンスを生成し、リアルタイムを使用するように構成された文字列adaptiveClassソースを使用。
getActivateExtension:
拡張機能を有効パケットは、それがにロードされます、条件を満たしたときに、条件付き&&値を拡張したものです。
たとえば、コールInvokcation Fitler、グループの消費者は、パケットがprividerフィルタの値である場合には、サーバ側が構築され、プロバイダを分割し。
//のみ公開するためのプロバイダのグループ、サービス //値は、構成を必要とする値、アクセスログの設定項目プロパティ値有する @Activate(グループプロバイダを=値= ACCESS_LOG_KEY) {実装AccessLogFilterフィルタをパブリッククラス
3.拡張インスタンス化
ダボ内部には、一般的に拡張ラップするほかに、引数なしでコンストラクタを拡張され、これはコンストラクタ拡張ポイントです。
拡張ポイントの例としては、プロパティを注入します。セットの先頭を横断する、方法ルックアップパラメータ・タイプ、およびのObjectFactory、完全な注入を介してオブジェクトの対応するタイプを取得します。
プロパティを注入し、それがソースをトレースデバッグ開始時に、私たちは多くの場合、このプロパティで何時間かわからない、トランスポーター、EXCHANGESERVERで見やすいですが、私は何とか感じます。
いくつかのポイント、ExtensionLoaderより重要な部分である基本的な方法よりも、上記マイクロカーネルの動作機構をいくつかのポイントを明確にするために、非常に明確であることができます。フォローアッププロセスが組み立てられています。