Java SPI使用例子

46 篇文章 0 订阅

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 将在搜索提供者配置文件的过程中被取消引用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值