java中的SPI机制实现

SPI简介

SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。为某一接口实现服务的机制。

适用场景

项目版本升级,不同开发人员负责自己的模块的升级且互不干扰。(公司项目中场景)

案例说明

  • 接口定义
package com.upgrade;
public interface UpgradeOperation {
    /**
     * 执行更新方法
     */
    void execute(OperationContext context);

    /**
     * 版本信息
     */
    OSVersionBuild build();

    /**
     * 执行同一版本更新优先级(从小到大依次执行)
     * @return
     */
    int priority();

    /**
     * 唯一标识符
     * @return
     */
    String getId();
}
  • 接口实现
    UdsqlUpgradeOperation7_3_1Impl
package com.upgrade.impl;
public class UdsqlUpgradeOperation7_3_1Impl implements UpgradeOperation {

    @Override
    public void execute(OperationContext context) {

    }

    @Override
    public OSVersionBuild build() {
        return OSVersionBuild.VERSION_7_3_1;
    }

    @Override
    public int priority() {
        return 0;
    }

    @Override
    public String getId() {
        return "7.3.1_udsql";
    }
}

UdsqlUpgradeOperation7_3_2Impl

package com.upgrade.impl;
public class UdsqlUpgradeOperation7_3_2Impl implements UpgradeOperation {

    @Override
    public void execute(OperationContext context) {

    }

    @Override
    public OSVersionBuild build() {
        return OSVersionBuild.VERSION_7_3_1;
    }

    @Override
    public int priority() {
        return 0;
    }

    @Override
    public String getId() {
        return "7.3.2_udsql";
    }
}
  • 实现SPI需要在META-INF/services中新建以服务接口命名的文件com.upgrade.UpgradeOperation.内容如下:
com.upgrade.impl.UdsqlUpgradeOperation7_3_1Impl
com.upgrade.impl.UdsqlUpgradeOperation7_3_2Impl
  • 客户端代码
    public static List<UpgradeOperation> getUpgradeOperations() {
        List<UpgradeOperation> upgradeOperations = new ArrayList<>();
        ServiceLoader<UpgradeOperation> operations = ServiceLoader.load(UpgradeOperation.class);
        Iterator<UpgradeOperation> iterator = operations.iterator();
        while (iterator.hasNext()) {
            UpgradeOperation operation = iterator.next();
            upgradeOperations.add(operation);
        }
        return upgradeOperations;
    }

利用SPI机制可以获取目录下所有UpgradeOperation接口的实现。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 124,419评论 18 136
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 29,068评论 18 398
  • 本文包括:1、Listener简介2、Servlet监听器3、监听三个域对象创建和销毁的事件监听器4、监听三个域对...
    廖少少阅读 3,852评论 6 28
  • 传送门 解读阿里Java开发手册(v1.1.1) - 异常日志 前言 阿里Java开发手册谈不上圣经,但确实是大量...
    kelgon阅读 3,720评论 4 50
  • ‖小可‖ "行走在冬夜的冷风中" 这句歌词适用于多种场景,多种心境。 我们无时无刻都在走路,上坡路、下坡路、停滞不...
    Nobodykk阅读 98评论 0 0
  • 昨天一个人做饭吃饭,一直等到狗哥回来。不知怎么的,心里突然变得慌慌的,很紧张很透不过气来。感觉非常糟糕。 又无...
    橙籽witLeeJongSuk阅读 225评论 0 1
  • 前两天孩子回家说妈妈老师让家长写一篇关于无烟生活的日记,说实话,真是愁着写,可是为了孩子为了我们的下一代...
    刘雪妈妈阅读 176评论 0 0
  • 还是很喜欢说 打 掐 最近我们也没对他使用过暴力,每次问他为什么这么说,他只会重复,告诉他这样说我们感受不好,然并...
    小米饭大大大阅读 79评论 0 0