ダボの元研究では、拡張メカニズムとExtensionLoaderクラスノート

 それは、再び長い時間のためのダボコードの前に、個人は怠け者です読んで、私はノートをまとめて取ることはありません、多くの人が忘れてしまいました。最近時間が慎重に次のソースレコードの要約、深い印象を研究します。

 環境:

  ソース・バージョン: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より重要な部分である基本的な方法よりも、上記マイクロカーネルの動作機構をいくつかのポイントを明確にするために、非常に明確であることができます。フォローアッププロセスが組み立てられています。

おすすめ

転載: www.cnblogs.com/keep-code/p/11058662.html