Java SPI使用例子
假定服务类型为 com.example.CodecSet,它用来表示某些协议的编码器/解码器对集合。在这种情况下,它是一个具有两种抽象方法的抽象类:
public abstract Encoder getEncoder(String encodingName); public abstract Decoder getDecoder(String encodingName);
每种方法都返回一个相应的对象;如果提供者不支持给定编码,则返回 null。典型的提供者支持一种以上的编码。
如果 com.example.impl.StandardCodecs 是 CodecSet 服务的实现,则其 jar 文件还包含一个指定如下的文件:
META-INF/services/com.example.CodecSet
此文件包含一行:
com.example.impl.StandardCodecs # Standard codecs
CodecSet 类在初始化时创建并保存一个服务实例:
private static ServiceLoader<CodecSet> codecSetLoader = ServiceLoader.load(CodecSet.class);
为了查找给定编码名称的编码器,它定义了一个静态工厂方法,该方法迭代所有已知并可用的提供者,只在找到适当的编码器或迭代完提供者时返回。StandardCodecs的getEncoder在此处,省略.
以下是直接使用调用getEncoder方法的.
public static Encoder getEncoder(String encodingName) { for (CodecSet cp :codecSetLoader) { Encoder enc = cp.getEncoder(encodingName); if (enc != null) return enc; } return null; }
getDecoder 方法的定义类似。
使用注意事项 如果用于提供者加载的类加载器的类路径包含远程网络 URL,则这些 URL 将在搜索提供者配置文件的过程中被取消引用。