あなたは、JavaのSPIのメカニズムを理解する必要があります

序文

私は今、私は約3週間の自宅で仕事をしてきたが、また、月の自宅で仕事に復帰するために何の会社が存在しないかわからない、大丈夫ジョブがどのような方法で影響を受けていない、私は個人的にはいつも、非常にフィットテレワークとIT業界であることを感じていますオフィスよりもさらに高いこの時間の効率化、海外事業ので、流行は少し多すぎる影響を引き起こしたので。

引き離し、この時間は、主にあなたと共有したいメカニズムを。週末には何かが欠けている、私は前に書いたブログを通じて反転し「IOCのコンテナの設計プラガブル」を実装はとてもエレガントではないことを発見し、。JavaSPI

私は見通しの概要すべき友人、需要を見ていません。

私は、http SpringMVCに似ていますが、フレームワークを実装し、非常に軽量もちろん、すべてのシングルトンBeanを格納することができIOCコンテナを必要とし、。

私はさまざまな方法があると思っていも他の人が達成するためのインタフェースを提供することができます。この実装IOCコンテナは、当然のことながら、IOCコンテナの切り替え処理は、確かにここで言及され、ハードコーディングされ存在していないプラグイン可能私は実装Aを使用したい場合はBを使用しているとき、私は、パッケージの導入にBをJARパッケージAを導入しました

cicada8-spi.md --- 0082zybply1gc6sqv3gp4j30zm0u0n8c.jpg

コードの範囲で始まることは簡単です達成するために、私たちは二つの違いを見てみましょうだろう、それはSPIさらに良いです。

SPIは何ですか

または以前の具体的な分析のもとで理解するにはSPI何ですか?

まず、それは実際にされたService provider interface速記、中国語に翻訳サービスプロバイダディスカバリ・インターフェースです。

しかし、ここで、ここで、この用語を混同してはいけない服务发现、と私たちはしばしば同一視することはできませんマイクロサービスとサービスの発見を聞きます。

私は上記のようにIOCコンテナ複数の実施形態ではA、B、C(これらはサービスとして理解することができる)は、私が実行時に使用される特定のどの実装知る必要があります。

実際には、本質的にこれは我々が繰り返し強調されたプログラミングを学ぶために開始された典型的なインターフェイス指向プログラミング、です。

SPIの練習

次は、私たちは、SPIだけでプラグイン可能なIOCコンテナを述べた使用方法を実現するために来ます。

今だけ言及したインタフェースを定義するので、自然に私たち最初の必要性、SPIインタフェース指向プログラミングの本質であります:

cicada8-spi.md --- 0082zybply1gc6tlhql39j31490u0wjj.jpg

どちらの数含まれているBeanコンテナに必要な操作:登録、アクセス、リリースBeanを。

他の人々が実現できるようにするためにはIOC、コンテナをので、我々は、単一に、このインタフェースModule、実装の導入のための他。

cicada8-spi.md --- 0082zybply1gc6tobsdgwj30u40ewdh1.jpg

私は、単一の例達成したいときにIOCコンテナを、私はちょうど新しい作成する必要がありModule、ちょうど導入モジュールを実装し、CicadaBeanFactoryインタフェースをすることができます。

もちろん、最も重要なのは必要であるresources新しいディレクトリを作成するMETA-INF/services/top.crossoverjie.cicada.base.bean.CicadaBeanFactoryファイルを、ファイル名は、我々がインタフェース(SPI仕様)の完全修飾名を定義する前でなければなりません。

cicada8-spi.md --- 0082zybply1gc6ts164zlj30uk0amq3x.jpg

完全修飾名を実装し、当社独自のクラスとなっている内容:

top.crossoverjie.cicada.bean.ioc.CicadaIoc
复制代码

作成したオブジェクトは、最終的にここに完全修飾名で反映されます想像してみてください。

しかし、このプロセスは、シャットオフのJava APIを提供してきました。

    public static CicadaBeanFactory getCicadaBeanFactory() {
        ServiceLoader<CicadaBeanFactory> cicadaBeanFactories = ServiceLoader.load(CicadaBeanFactory.class);
        if (cicadaBeanFactories.iterator().hasNext()){
            return cicadaBeanFactories.iterator().next() ;
        }

        return new CicadaDefaultBean();
    }
复制代码

ときにclasspath私たちは、クラス(導入のjarパッケージの実装クラス)を持っているという認識があり、それができるjava.util.ServiceLoader(クラスは複数の実装が存在するが、通常、我々は一つだけを必要とする必要がある場合があります)すべてのツールの実装クラスを見つけること。


当然、非常に簡単な使用する準備ができて多くの後。

    <dependency>
        <groupId>top.crossoverjie.opensource</groupId>
        <artifactId>cicada-ioc</artifactId>
        <version>2.0.4</version>
    </dependency>
复制代码

私達はちょうど私たちが唯一の依存関係があることができ交換する必要が実装を変更したいとき、その実現の使用の導入に頼ることができるようにする必要があります。

これは、コード柔軟の行変更しなかった可拔插選択IOCのコンテナを。

SPIの他のアプリケーション

通常業務を達成するためにSPIに直接使用されるが、実際には、フレームワークの大半は、我々が使用されていないが、SPIは、その機能を拡張するための便利なユーザインタフェースを提供します。

例えば、Dubbo拡張子の範囲を提供します:

cicada8-spi.md --- 0082zybply1gc6ue6zubvj30gq0pymyq.jpg

同じタイプのRPCフレームはmotan、拡張応答して提供されます。

cicada8-spi.md --- 0082zybply1gc6ufacqt5j30lm0j8q5j.jpg

これらを使用するJavaのSPIとの両方が非常に似ていますが、わずかに異なる原理だけでなく、新機能を追加します。

例えば、許可証は、単一の実施形態と同様です。motanspi

別の例MySQLドライバパッケージは、SPIを使用して接続ロジックを実現することです。

cicada8-spi.md --- 0082zybply1gc6uqg2ga2j30ii0bmdgz.jpg

概要

JavaそのSPI次のような実際には少し小さな問題、

  • すべての低効率をロードするためのトラバーサルの実装クラス。
  • 場合は、複数ServiceLoader同時にload並行問題(誰がそれを行うための)が存在します。

、要約するとSPI、高度な技術ではありません、私たちの毎日の開発に面したインターフェイス自体も不可欠なスキルである一方で、本質的に、プログラミングインターフェースを向いている、理解使用はSPIまた、非常に便利です。

すべての紙出典:

github.com/TogetherOS/...

親指を共有し、私にとって最大のサポートです

おすすめ

転載: juejin.im/post/5e5316f0e51d452728646ce8