spi~在插件开发过程中的使用

[复制链接]
发表于 2023-2-7 17:52:55 | 显示全部楼层 |阅读模式
spi是原生java的组件,通过META-INF/services目录进行注册,通过ServiceLoader进行加载,一般可以用在组件开发中,你在公用组件中封装好逻辑,将个性化的部分抽象出一个接口,接口通过spi的方式进行加载,在外部开发人员引用你的组件之后,通过实现接口来扩展个性化的功能,再通过META-INF/services对实现类进行注册。
组件端

先定义一个公开的接口
  1. public interface SpiHello {
  2.   void printHello();
  3. }
复制代码
一个公开的组件
  1. public static void print() {
  2.                 InputStream resource = Tool.class.getClassLoader().getResourceAsStream("licence.txt");
  3.                 ByteArrayOutputStream bos = new ByteArrayOutputStream();
  4.                 int bufSize = 1024;
  5.                 byte[] buffer = new byte[bufSize];
  6.                 int len = 0;
  7.                 while (true) {
  8.                         try {
  9.                                 if (!(-1 != (len = resource.read(buffer, 0, bufSize))))
  10.                                         break;
  11.                         }
  12.                         catch (IOException e) {
  13.                                 throw new RuntimeException(e);
  14.                         }
  15.                         bos.write(buffer, 0, len);
  16.                 }
  17.                 ServiceLoader<SpiHello> spiHellos = ServiceLoader.load(SpiHello.class);
  18.                 Iterator<SpiHello> iterable = spiHellos.iterator();
  19.                 while (iterable.hasNext()) {
  20.                         iterable.next().printHello();
  21.                 }
  22.                 System.out.println("value=" + bos.toString());
  23.         }
复制代码
在开发人员使用时,需要注册他的实现类

  1. com.lind.pk.Tool.print();
复制代码
结果

注意,在组件内部读文件时,需要采用文件流的方式,否则,在调用地将出现无法加载的问题

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表