著者:中国石シャン
インタビューの質問
SPIのアイデアはどのようなダボのですか?
心理学的分析インタビュアー
そして、あなたを依頼するSPIは何で、より多くの困難な問題は、SPIで少し聞いて、いくつかの基本的な事柄はダボを理解し、オーバー聞いていくつかの基本的な事柄の前で詠唱尋ね、あなたはすべての[OK]を決定しなければならない中で、深続行しますか?次に、SPIのあなたのダボがどのように達成することである頼みますか?
実際には、ダボの方法を習得を参照してください。
フェイス質問解析
SPIは何ですか?
SPIは、簡単に言えば、されて service provider interface
それが何を意味する白は、たとえば、あなたがインターフェイスを持っていることを、このインターフェースは今3つのクラスが達成したシステムがそれを実行しているとき、そして最後に、このインタフェースのどの実装クラスを選ぶのか?これは、対応する実装にロードされたクラス、およびオブジェクトインスタンスの実装クラスを見つけるために、コンフィギュレーションまたはデフォルト設定を指定するには、SPI、必要性を必要とします。
栗のために。
あなたは、インターフェイスAを持っていますか A1 / A2 / A3は、インターフェースAの異なる実装されています あなたは構成によって 接口 A = 实现 A2
、システムの実際の動作はA2で達成あなたの設定を、ロードしますそして時にサービスを提供するオブジェクトをインスタンス化。
SPIのメカニズムは、一般的にどこ使用されていますか?あなたが機能を拡張するために、独自のプラグイン、あなたのオープンソースのフレームワークにプラグインを書くために他人をしたい場合はプラグイン拡張シーン、たとえば、あなたは、他の誰かに使われているオープンソースのフレームワークを開発し、この時間のSPIアイデアは、それを使用するには。
JavaのSPIの考え方を反映しています
SPI古典的な考え方は、我々は通常、例えば、JDBCを使用中に、反映されています。
JDBC Javaは、インターフェイスのセットを定義するが、JDBCのJava実装クラスを提供していません。
しかし、実際には、プロジェクトのRANは、JDBCインタフェースの実装クラスにそれを使用するために何をしたいですか?一般的に言って、我々はMySQLのような、自分のデータベースによると使用する必要があり、あなたがされます mysql-jdbc-connector.jar
に来る導入し、オラクル、あなたがされ oracle-jdbc-connector.jar
てくるために導入します。
システムが実行されている場合、あなたは、JDBCインタフェースを使用して発生した、彼は底部に設けられに瓶のようなものにあなたを達成するために使用されます。
SPIのダボのアイデア
ダボはまた、SPIの考えを使用しますが、SPI、JDKメカニズムはメカニズムSPI独自の実装で使用していませんでした。
プロトコルプロトコル= ExtensionLoader .getExtensionLoader(プロトコルの.class).getAdaptiveExtension();
システムが動作しているとき、プロトコルインターフェースは,,ダボこのプロトコルインタフェースの実装クラスが使用するオブジェクトをインスタンス化するものを選択すべきかを決定します。
それはあなたが過去にJVMにロードされたプロトコルの実装クラスを設定し、議定書にコンフィギュレーションを行って、その後、オブジェクトをインスタンス化し、それに議定書というあなたの実装クラスを使用します。
上記のコード行は多用でダボであり、多くの構成要素が保持され、インタフェースの複数の実装、およびその後動的システムが稼働している構成に応じて、対応する実装クラスを検索します。あなたが設定しない場合、デフォルトの実装では、十分に何ら問題は行かないだろう。
@SPI("ダボ") パブリックインターフェースプロトコル{ INT getDefaultPort()。@Adaptive < T> 輸出< T> エクスポート(インボーカ< T> 呼び出し)がスローRpcException。@Adaptive < T> インボーカ< T> 参照(クラス< T> 型、URLをURL)スローRpcExceptionと、無効)(破壊します。}
ダボ自身の瓶には、内/META_INF/dubbo/internal/com.alibaba.dubbo.rpc.Protocol
のファイル:
ダボ= com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol
のhttp = com.alibaba.dubbo.rpc.protocol.http.HttpProtocol
ヘッセ= com.alibaba.dubbo.rpc.protocol.hessian.HessianProtocol
だから、遊びのSPIのダボのデフォルトのメカニズムを見ているか、実際にはプロトコルのインタフェースであり、@SPI("dubbo")
SPIメカニズムが提供する実装クラス、実装クラスは、構成ファイルへのデフォルトのキーとしてダボによって発見されたことを言いました、キーはダボデフォルトの実装で見つけることができるのと同じのインタフェースの完全修飾名とプロファイル名です com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol
。
あなたは、動的なクラスのデフォルトの実装を置き換えたい場合は、使用する必要がある @Adaptive
追加するには2つの方法があり、インタフェース、プロトコル・インタフェースを @Adaptive
両方のインターフェイスがプロキシ実装されているということであるコメントは、。
それは何を意味するのでしょうか?
例えば、2つは、この議定書のインタフェースに従事する @Adaptive
エージェント・コードを持つことになり、このクラスの薬剤の両方の方法は、エージェント・コードは実行時に動的URLへのプロトコルに基づいていることを、実行時にプロトコル用のプロキシクラスを生成するメソッドをタグ付けコメントキーを取得するには、デフォルトでは、あなたも、あなた自身を指定することができますが、他のキーが指定されている場合、それは実装クラスの別のインスタンスを取得します、ダボです。
ダボであなたのコンポーネントを拡張する方法
ここでは、独自の拡張コンポーネントダボの言う方法です。
自分の作品を書き、それがジャーパッケージを標識することができるならば、内部の src/main/resources
ディレクトリ、に従事する META-INF/services
というファイルを置いた、: com.alibaba.dubbo.rpc.Protocol
、ファイルに従事my=com.bingo.MyProtocol
。軌道に乗るためにネクサスPW自身の瓶。
その後、自分でやる dubbo provider
春コンフィギュレーションファイルに設定し、その後瓶の独自のうちに依存し、このプロジェクトでは、プロジェクトを:
< ダボ:プロトコル名=」私の」ポート=」20000” />
プロバイダの起動は、私たちのジャーの中に袋をロードしますmy=com.bingo.MyProtocol
、あなたは方法は、上記の、あなたがダボを大量に置き換えることができ、これは説明するのは簡単です、あなたはあなたの構成に応じて定義されたMyProtocolを使用することができ、構成のライン内部コンポーネント、それはあなたのjarファイルのパッケージを投げるし、[構成]をクリックします。
あなたは、限り、彼らは瓶を書いて、事を拡張し、あなたのjarファイルに依存して、あなたの消費者やプロバイダの作品をみましょう、あなたのjarファイルのディレクトリを指定したい場合は、と言うことです上記と同様の拡張ポイントを多数提供し、ダボプロファイルの下で優れたインタフェース名はを通じて内部に対応します key=实现类
。
そして、対応するコンポーネントのために、同様の <dubbo:protocol>
インターフェイスを実装する実装クラスを、対応するあなたの鍵のことで、あなたは、独自の実装を提供ダボ様々な機能に自分自身を拡張することができます。