最近、会社の フレームワーク の一部と、以前に見たオープン ソース フレームワークの一部が、サービスの検出とアクセスに Java の SPI メカニズムを使用していることを知りました。
それでは、Java spiの仕組みの考え方を簡単にまとめてみましょう。
ログモジュールソリューション、xml解析モジュール、jdbcモジュールソリューションなど、私たちのシステム内の各抽象モジュールには多くの異なる実装ソリューションが存在します。 オブジェクト指向設計では、通常、インターフェースに基づいてモジュール間でプログラミングし、モジュール間で実装クラスをハードコーディングしないことをお勧めします。特定の実装クラスがコードに関与すると、プラグ可能性の原則に違反します。実装を置き換える必要がある場合は、コードを変更する必要があります。
プログラム内で動的に指定しなくてもモジュールを組み立てられることを実現するには、サービス検出メカニズムが必要です。 Java SPI は、特定のインターフェイスのサービス実装を検索するメカニズムを提供します。これは、アセンブリの制御をプログラムの外に移動するという IOC の考え方に似ています。このメカニズムは、モジュラー 設計において特に重要です。
設定ファイル を通じて特定の実装クラス名を見つけ、インスタンス化をロードしてモジュール インジェクションを完了できます。
このような規約に基づいて、コード内で指定することなく、サービスインターフェースの実装クラスを簡単に見つけることができます。 jdk は、サービス実装ルックアップ用のツール クラスを提供します: java.util.ServiceLoader1.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 サイトの他の関連記事を参照してください。