JavaにおけるSPIメカニズム

3140 ワード

テキストリンク:https://blog.csdn.net/sigangjun/article/details/79071850
目次
1.SPIメカニズムの概要
2.SPI具体的な約束
3.シーンの適用
3.1.common-logging
3.2.jdbc 
4.ケーススタディ
1.SPIメカニズムの概要
SPIのフルネームはService Provider Interfaceです.多くの開発者は、メーカーやプラグイン向けなので、よく知らないかもしれません.
Java.util.ServiceLoaderのドキュメントでは比較的詳細に説明されています.簡単な総括の下でjava spiメカニズムの思想.
私たちのシステムの抽象的な各モジュールには、ログモジュールのスキーム、xml解析モジュール、jdbcモジュールのスキームなど、多くの異なる実装スキームがあります.オブジェクト向けの設計では,モジュール間でインタフェースに基づいてプログラミングを推奨し,モジュール間で実装クラスをハードコーディングしない.コードに具体的な実装クラスが含まれると、プラグイン可能な原則に違反し、実装を置き換える必要がある場合は、コードを修正する必要があります.モジュールの組み立て時にプログラムに動的に示さないようにするには,サービス発見メカニズムが必要である.
 JAva spiは、あるインタフェースのためにサービス実装を探すメカニズムを提供する.IOCの考えに似ているのは、組み立ての制御権をプログラムの外に移すことであり、モジュール化設計においてこのメカニズムが特に重要である.
2.SPI具体的な約束
JAva spiの具体的な約束は、サービスのプロバイダがサービスインタフェースの実装を提供した後、jarパッケージのMETA-INF/services/ディレクトリにサービスインタフェースと命名されたファイルを同時に作成することである.このファイルには,このサービスインタフェースを実現する具体的な実装クラスがある.外部プログラムがこのモジュールを組み立てると、jarパッケージMETA-INF/services/のプロファイルから具体的な実装クラス名を見つけ、インスタンス化をロードしてモジュールの注入を完了することができます. このような約束に基づいて、コードで作成する必要がなく、サービスインタフェースの実装クラスをよく見つけることができます.
jdkはサービス実装検索のツールクラスを提供します:java.util.ServiceLoader
3.シーンの適用
3.1.common-logging
apacheが最初に提供したログのフェースインタフェース.インタフェースのみで、実装されていません.具体的なシナリオは各プロバイダによって実現され、発見ログプロバイダはMETA-INF/services/org.apache.commons.logging.LogFactoryプロファイルをスキャンし、そのファイルの内容を読み取ることによってログプロバイダ実現クラスを見つける.
ログインプリメンテーションにこのファイルが含まれており、ログファクトリインタフェースのインプリメンテーションクラスをファイルに作成すればよい.   
3.2.jdbc 
jdbc 4.0以前は、開発者はClass.forName(「xxx」)に基づいてドライバをロードする必要があり、jdbc 4もspiのメカニズムに基づいてドライバプロバイダを発見し、META-INF/services/java.sql.Driverファイルで実装クラスを指定することでドライバプロバイダを暴露することができる.
4.ケーススタディ
コンテンツ管理システムには検索モジュールがあります.インタフェースに基づいてプログラミングされています.検索の実装は、ファイルシステムに基づく検索であっても、データベースに基づく検索であってもよい.
インタフェースの定義:
public interface Search {
    public List search(String keyword);
}

A社はファイルシステム検索方式でSearchインタフェースを実現し、B社はデータベースシステム方式でSearchインタフェースを実現した
  •           A社実現クラス com.A.spi.impl.FileSearch  
  •           B社が実現するクラス com.B.spi.impl.DatabaseSearch  

  • では、A社が実装jarパッケージをリリースする場合は、jarパッケージのMETA-INF/services/my.xyz.spi.Searchファイルに次のように書きます.
    com.A.spi.impl.FileSearch
    では、B社が実装jarパッケージをリリースする場合は、jarパッケージのMETA-INF/services/my.xyz.spi.Searchファイルに次のように書きます.
    com.B.spi.impl.DatabaseSearch
    public class SearchFactory {
    
        private SearchFactory(){
    
        }
    
        public static Search newSearch(){
            Search search = null;
            ServiceLoader serviceLoader = ServiceLoader.load(Search.class);
            Iterator iterator = serviceLoader.iterator();
            if(iterator.hasNext()){
                search = iterator.next();
            }
            return search;
        }
    }

     
    public class SearchTest {
        public static void main(String[] args) {
            Search search = SearchFactory.newSearch();
            search.search("keyword");
        }
    }

    SPIの中で最も核心的なのは,インタフェース定義が一方であり,インタフェースの実現が第三者または第四方であることがわかる.ただし、このインタフェースを使用する必要があるのは第1者なので、第1者が使用する場合は、META-INF/services/{インタフェース定義のクラス名のフルネーム}  このファイルの定義を探します.
    変換元:
    JavaにおけるSPIメカニズム