我正在尝试整理一个基本的基于 SPI 的处理程序注册表,我从 HandlerRegistry 中查找它。当我使用 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 类。我在我的 jar 中创建了一个名为 META-INF/services/com.example.handler.Handler 的文件,其中包含单行
com.example.handler.handlers.DummyHandler
根据javadoc。我的单元测试只是调用 lookup() 方法来验证查找处理程序的项目。当然,最终需要进行某种检查以查看这是否是该项目的正确处理程序,但此时我什至没有看到我的 DummyHandler 类被注册表加载。我在这里做错了吗?
谢谢!