Java SPI アノテーション (@ServiceLoader、@Inherited、@ServiceProvider) はサービス検出メカニズムを実装し、アプリケーションが実行時にサービス プロバイダーを動的にロードして検索できるようにします。具体的な手順には、SPI インターフェイスを実装するサービス プロバイダー実装を作成し、それにアノテーションを付けること、ServiceLoader.load( を使用して、META-INF/services にある) サービス実装クラスの完全修飾名を含むファイルを作成することなどが含まれます。 ...) メソッドを使用してサービス プロバイダー実装をロードし、使用可能な実装のイテレータを返します。このメカニズムを通じて、アプリケーションはサービス プロバイダーを動的にロードして使用できるため、スケーラビリティとモジュール性が強化されます。
Java SPI アノテーション: サービス検出メカニズムの実装
はじめに
Java サービスプロバイダー インターフェイス (SPI) は、サービス検出メカニズムを実装するために使用されるアノテーションとインターフェイスのセットです。サービス ディスカバリにより、アプリケーションは実行時に特定のインターフェイスを実装するサービス プロバイダーを動的に検索して読み込むことができます。
コア アノテーション
次のアノテーションは SPI にとって重要です:
@ServiceLoader
: サービスをマークするために使用されます。プロバイダ実装クラス。 @Inherited
: サブクラスが @ServiceLoader
アノテーションを継承していることを確認します。 @ServiceProvider
: Java 9 以降の @ServiceLoader
を置き換えます。 サービス ディスカバリの実装
サービス ディスカバリには次の手順が含まれます:
SPI
インターフェイスを実装し、@ServiceLoader
または @ServiceProvider
でアノテーションを付けます。 META-INF/services
にファイルを作成します: インターフェイスの完全修飾名と同じ名前でサービス インターフェイスのファイルを作成します。このファイルには、実装クラスの完全修飾名が含まれています。 ServiceLoader.load(...)
メソッドを使用してサービス プロバイダー実装をロードします。これにより、利用可能なすべてのサービス プロバイダー デバイスの反復が返されます。 。 実際的なケース
printMessage
メソッドを定義する MessagePrinter
インターフェイスがあるとします。このインターフェイスを実装する ConsoleMessagePrinter
クラスを作成します。
@ServiceLoader public class ConsoleMessagePrinter implements MessagePrinter { @Override public void printMessage(String message) { System.out.println(message); } }
ファイル javax.print.MessagePrinter
を META-INF/services
に作成します。これには、ConsoleMessagePrinter
クラスの完全修飾名が含まれます:
com.example.ConsoleMessagePrinter
アプリケーションでは、次のコードを使用してサービス プロバイダーをロードして使用できます:
ServiceLoader<MessagePrinter> loader = ServiceLoader.load(MessagePrinter.class); for (MessagePrinter printer : loader) { printer.printMessage("Hello, world!"); }
出力:
Hello, world!
結論
Java SPI アノテーションを使用すると、アプリケーションが特定のインターフェイスを実装するサービス プロバイダーを動的に検索してロードできるようにするサービス検出メカニズムを簡単に実装できます。これは、スケーラブルなモジュール型アプリケーションを実装する場合に役立ちます。
以上がJava SPI アノテーションはサービス検出メカニズムをどのように実装しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。