ホームページ  >  記事  >  Java  >  Java spi メカニズムの簡単な紹介

Java spi メカニズムの簡単な紹介

黄舟
黄舟オリジナル
2017-03-15 11:27:281642ブラウズ

最近、会社の フレームワーク の一部と、以前に見たオープン ソース フレームワークの一部が、サービスの検出とアクセスに Java の SPI メカニズムを使用していることを知りました。

それでは、Java spiの仕組みの考え方を簡単にまとめてみましょう。

ログモジュールソリューション、xml解析モジュール、jdbcモジュールソリューションなど、私たちのシステム内の各抽象モジュールには多くの異なる実装ソリューションが存在します。 オブジェクト指向設計では、通常、インターフェースに基づいてモジュール間でプログラミングし、モジュール間で実装クラスをハードコーディングしないことをお勧めします。特定の実装クラスがコードに関与すると、プラグ可能性の原則に違反します。実装を置き換える必要がある場合は、コードを変更する必要があります。

プログラム内で動的に指定しなくてもモジュールを組み立てられることを実現するには、サービス検出メカニズムが必要です。 Java SPI は、特定のインターフェイスのサービス実装を検索するメカニズムを提供します。これは、アセンブリの制御をプログラムの外に移動するという IOC の考え方に似ています。このメカニズムは、

モジュラー 設計において特に重要です。

Java spiの具体的な取り決めは次のとおりです:

サービスプロバイダーがサービスインターフェースの実装を提供するとき、サービスインターフェースにちなんで名付けられたファイルもjarのMETA-INF/services/ディレクトリに作成されます。パッケージ。 。このファイルには、サービス インターフェイスを実装する特定の実装クラスが含まれています。外部プログラムがこのモジュールをアセンブルするとき、jar パッケージ META-INF/services/ 内の

設定ファイル を通じて特定の実装クラス名を見つけ、インスタンス化をロードしてモジュール インジェクションを完了できます。

このような規約に基づいて、コード内で指定することなく、サービスインターフェースの実装クラスを簡単に見つけることができます。

jdk は、サービス実装ルックアップ用のツール クラスを提供します: java.util.ServiceLoader

Example

1.common-logging

apache は、提供される最も古いログ ファサード インターフェイスです。インターフェイスのみで実装はありません。具体的なソリューションは各プロバイダーによって実装されています。ログ プロバイダーが META-INF/services/org.apache.commons.logging.LogFactory 設定ファイルをスキャンし、内容を読み取ることでログ プロバイダーの実装クラスを見つけていることがわかります。ファイルの。ログ実装にこのファイルが含まれており、ファイル内で LogFactory ファクトリ インターフェイスの実装クラスを定式化している限り。 2.jdbcjdbc4.0、開発者は依然として Class

.

forName("xxx") に基づいて driver

をロードする必要があります。jdbc4 も spi メカニズムに基づいています。ドライバー プロバイダーを検出した後、META-INF/services/java.sql.Driver ファイルで実装クラスを指定することで、ドライバー プロバイダーを公開できます。

3. 簡単な例を自分で作成します コンテンツ search

システムがあり、表示と検索の 2 つのモジュールに分かれているとします。表示と検索はインターフェースプログラミングに基づいています。検索の実装は、

ファイル システム検索またはデータベース ベースの検索に基づいている場合があります。インスタンスコードは以下のとおりです。 arSearch.java: 検索インターフェース

package search;  
  
import java.util.List;  
  
import definition.Doc;  
  
public interface Search {  
    List<Doc> search(String keyword);  
}
e

filesearch.java: Rreeee

databasearch.java

rreeeeeeERCHTEST.javarreee META-INF を実現するファイルシステムを検索します。 /services/search.ファイルを検索します。

search.Search ファイルの内容が "search.FileSearch" の場合、プログラム出力は次のようになります:

package search;  
  
import java.util.List;  
  
import definition.Doc;  
  
public class FileSearch implements Search {  
  
    @Override  
    public List<Doc> search(String keyword) {  
        System.out.println("now use file system search. keyword:" + keyword);  
        return null;  
    }  
  
}
search.Search ファイルの内容が "search.DatabaseSearch" の場合、プログラム出力は次のようになります:

package search;  
  
import java.util.List;  
  
import definition.Doc;  
  
public class DatabaseSearch implements Search {  
  
    @Override  
    public List<Doc> search(String keyword) {  
        System.out.println("now use database search. keyword:" + keyword);  
        return null;  
    }  
  
}

SearchTest で見られます 特定の実装に関連するコードはありませんが、サービスの実装を見つけるための spi メカニズムに基づいています

以上がJava spi メカニズムの簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。