SPIでのJava

SPIは、サービスプロバイダインタフェースの省略形です。この記事は、SPIが使用されて次に何をすべきかを説明し、そしてどのように使用するかします。SPIは、この事は非常に簡単に使用することがまだあります。

SPIは何ですか

SPIは、カップリング問題を解決するために主にあります。私たちは、指向プログラミング・インタフェースは、プログラミングの良い方法で、Javaが事前に仕様の一部、インタフェースの数を定義するだろう、とのインタフェースの実装は限り彼らは仕様が​​可能インタフェースに従うよう、第三者によって実装することができます知っています。たとえば、私たちは、JDBCに精通している場合です。

SPIは、ClassLoaderを言及する必要があり、一般的なクラスローダを述べました。私たちは、JVMは、3つのクラスローダ、BootstrapClassLoader、ExtClassLoader、AppClassLoaderで構成されていることを知っています。彼らの両親は、委任されたモードを採用します。一方、JDKはまた、我々は、クラスのロード時間にこの方法を使用することを示唆しています。SPIはクラスにこの方法を見つけることができない場合しかし、それは問題を引き起こす可能性があります。

委任両親モードの使用を説明するための単純なJDBCクラス:

  • まず第一に、我々はインターフェースは、Java JDBCのコアパッケージであることを知って、rt.jar内、このジャーをBootstrapClassLoadreがロードされています。
  • 第二に、SPI負荷は、サービスのjarパッケージMETA-INFに基づいて対応するクラスファイルを検索するためのルールを実装します。META-INFファイルを定義下サービスでは、ファイル名は、完全型インタフェースクラスであり、ファイルの内容が実装クラスの完全なクラス名です。
  • ここでも、ロードされたクラスを達成するためには、クラスローダがBootstrapClassLoaderで、私たちが知っているBootstrapClassLoaderデフォルトの現在のクラス、現在のクラスローダを使用して実装クラスをロードするClass.forNameのことで、呼び出して、クラスにClass.forNameするのDriverManagerであります負荷をrt.jarの。サードパーティの実装が明らかrt.jarのではありません
  • 最後に、この問題を解決する方法を、SPIは、このように積載子クラスローダAppClassLoaderクラスによってロードされるように、親クラスローダBootstrapClassLoaderを避け、サードパーティの実装クラスをロードするためのContextClassloaderを使用しています。ContextClassloaderとは、この問題を解決するために設計されています。

SPIはどのように使用します。

  • まず、インターフェイスを実装

  • 第二に、インタフェースの実装クラスを手に入れます

  • META-INFの瓶のサービスでファイルを構築するためのSPIの必要性は、SPI実装クラスは、この文書の基礎を見つけることです。

文件名:接口的全类名
文件内容: 实现类的全类名
复制代码
  • 最後に、ServiceLoaderをロードすることにより、指向プログラミング・インターフェース、デカップリングの目的。
Hello hello = null;
ServiceLoader<Hello> serviceLoader = ServiceLoader.load(Hello.class);
Iterator<Hello> iter = serviceLoader.iterator();
if (iter.hasNext()) {
    hello = iter.next();
}
System.out.println(hello.say());
复制代码

概要

上記の説明を通じて、SPIは、有用な定義インターフェース仕様の多くあるべきであり、プログラミングの過程においても、プログラミング・インタフェース、書き込みコードに配向することができるがインタフェースの実装は、様々な第三者によって実施することができる参照それは非常にエレガントです。

おすすめ

転載: juejin.im/post/5df1d3eff265da33ed411c5d