Java SPI (Service Provider Interface) は、Java プラットフォームでのサービス検出のメカニズムであり、アプリケーションが実行時にインターフェイスを実装するクラスを動的にロードし、インターフェイスを介して対話できるようにします。
Java SPI には、サービス プロバイダー、サービス リクエスター、構成ファイルの 3 つのロールがあります。サービス プロバイダーは、インターフェイスを実装する具体的なクラスを指し、サービス リクエスターは、これらのサービス プロバイダーを使用する必要があるアプリケーション プログラムを指します。
具体的には、Java SPI メカニズムは通常、次の手順で構成されます。
- インターフェイスを定義する: 特定のサービスを提供するための複数のメソッドを含むインターフェイスを定義します。
- 実装クラスを作成する: インターフェイスを実装する複数のクラスを作成すると、これらのクラスが特定のサービスを提供します。
- 構成ファイル: META-INF/services ディレクトリに、インターフェイスの完全修飾名にちなんで名付けられたファイルを作成します。このファイルには、インターフェイスを実装するすべてのクラスの完全修飾名が含まれています。
- 実装クラスのロード: Java SPI メカニズムを使用して、インターフェースを実装するすべてのクラスを動的にロードし、それが提供するサービスを呼び出します。
Java SPI メカニズムの利点は、アプリケーションをより柔軟にし、コードを変更せずに機能を拡張し、アプリケーションの結合を減らすことができることです。
以下は、Java SPI を実装する方法の簡単な例です。
最初にインターフェイスを定義します。次に例を示します。
public interface MyService {
void sayHello();
}
次に、インターフェイスを実装する 1 つ以上のクラスを記述します。次に例を示します。
public class MyServiceImpl1 implements MyService {
@Override
public void sayHello() {
System.out.println("Hello from MyServiceImpl1");
}
}
public class MyServiceImpl2 implements MyService {
@Override
public void sayHello() {
System.out.println("Hello from MyServiceImpl2");
}
}
Create a service provider configuration file, and create a file named com.example.MyService in the src/main/resources/META-INF/services directory. ファイルの内容は、インターフェイスを実装するクラスの完全修飾名です。例えば:
com.example.MyServiceImpl1
com.example.MyServiceImpl2
Java の SPI メカニズムを使用して実装クラスをロードすると、実装クラスを動的にロードし、それらのメソッドを呼び出すことができます。例えば:
ServiceLoader<MyService> serviceLoader = ServiceLoader.load(MyService.class);
for (MyService service : serviceLoader) {
service.sayHello();
}
以上の手順で、シンプルな Java SPI が実現されます。実際の使用では、コードを変更することなく、必要に応じて構成ファイル内の新しい実装クラスを置換または追加できます。
おなじみの springboot の自動アセンブリも SPI に基づいており、 @EnableAutoConfiguration アノテーションと META-INF/spring.factories ファイルによる自動構成を実現しています。
spring.factories ファイルの構成情報は、次の形式で構成されます。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.config.MyConfiguration,\
com.example.demo.config.OtherConfiguration
このうち、 org.springframework.boot.autoconfigure.EnableAutoConfiguration は完全修飾アノテーション クラス名であり、自動構成クラスを指定するために使用されます。次はクラス名のリストで、それぞれが自動構成クラスを表しています。Spring Boot が起動すると、これらのクラスは、この構成ファイルの情報に基づいて自動的に構成されます。プロジェクトにこれらのクラスの依存関係がない場合、これらの自動構成は有効になりません。
\ は改行文字を表し、その後に自動構成クラスの完全修飾名が続き、複数の自動構成クラスはコンマで区切られます。
このようにして、2 つの自動構成クラスを EnableAutoConfiguration に追加できます。