我正在尝试整理一个基于SPI的基本处理程序注册表,该注册表是从HandlerRegistry查找的.当我使用ServiceLoader.load(Handler.class)初始化提供程序,然后迭代列表以延迟加载它们时,我没有看到该类的任何实例.为了使这一过程尽可能简单,我的HandlerRegistry类是:
public class HandlerRegistry
{
private static HandlerRegistry registry;
private ServiceLoader 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 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类.我在这里做错什么了吗?
谢谢!