HandlerRegistry から検索する基本的な SPI ベースのハンドラーのレジストリをまとめようとしています。ServiceLoader.load(Handler.class) を使用してプロバイダーを初期化し、リストを繰り返して遅延ロードすると、クラスのインスタンスが表示されません。これをできるだけ単純に保つと、私の HandlerRegistry クラスは次のようになります。
public class HandlerRegistry
{
private static HandlerRegistry registry;
private ServiceLoader<Handler> handlerLoader;
private HandlerRegistry()
{
handlerLoader = ServiceLoader.load(Handler.class);
}
public static synchronized HandlerRegistry getRegistry()
{
if (registry == null) {
registry = new HandlerRegistry();
registry.init();
}
return registry;
}
private void init()
{
System.out.println("HandlerRegistry.init()");
}
public Handler lookup(String item)
{
System.out.println("lookup("+item+")");
try {
Iterator<Handler> it = handlerLoader.iterator();
while (it.hasNext()) {
Handler handler = it.next();
System.out.println("found handler "+handler);
}
}
catch (ServiceConfigurationError err) {
err.printStackTrace();
}
return null;
}
}
私は com.example.handler.Handler インターフェイス (簡単にするために今は空です) と、そのインターフェイスを実装する com.example.handler.handlers.DummyHandler クラスを持っています。META-INF/services/com.example.handler.Handler という名前の jar にファイルを作成しました。これには単一行が含まれています。
com.example.handler.handlers.DummyHandler
javadocによると。私の単体テストは、単純に lookup() メソッドを呼び出して、アイテムのハンドラーを検索することを確認します。もちろん、最終的には、これがこのアイテムの適切なハンドラーであるかどうかを確認するために何らかのチェックが必要になりますが、この時点では、私の DummyHandler クラスがレジストリによって読み込まれることさえ見ていません。ここで何か間違ったことをしていますか?
ありがとう!