Java SPI机制实践

Java SPI机制实践

1. SPI机制

SPI(Service Provider Interface),是Java自带的服务加载及发现机制,便于第三方对服务进行实现或扩展。

服务,通常用接口或抽象类来定义,实现类也可以但不推荐使用。
服务提供者,即服务的具体实现,通常是一个实现类,当然通常也可以是一个第三方独立服务的代理。

服务加载及发现机制,定义好服务及提供者之后,在META-INF/services下新建一个文件,以服务接口或抽象类的全限定名命名。文件中每一行代表一个服务提供者,写实现类的全限定名,以#号代表注释。文件定义好后,使用ServiceLoader工具类进行加载和实例化。

2. SPI实践

Hash算法为例,先定义服务如下:

public interface Hash {

    public String hash(String value);

}

Java自带的及murur的服务实现如下:

public class JavaHash implements Hash {

    public JavaHash() {
    }

    @Override
    public String hash(String value) {
        Objects.requireNonNull(value, "value cann't be null");
        int hash = value.hashCode();
        return Integer.toHexString(hash);
    }

}

public final class MurmurHash implements Hash {

    public MurmurHash() {
    }

    @Override
    public String hash(String value) {
        Objects.requireNonNull(value, "value cann't be null");
        byte[] bytes = value.getBytes();
        int hash = this.hash(bytes, bytes.length, -1);
        return Integer.toHexString(hash);
    }

    private int hash(byte[] data, int length, int seed) {
        int h = seed ^ length;
        ……
        return h;
    }

}

META-INF/services下新建文件com.github.myron.spi.Hash,内容如下:

# Hash Service Provider
com.github.myron.spi.JavaHash
com.github.myron.spi.MurmurHash

服务加载及使用示例如下:

public static void main(String[] args) {
    ServiceLoader<Hash> hashServices = ServiceLoader.load(Hash.class);

    String value = "A simple service-provider loading facility.";
    for (Hash hash : hashServices) {
        String result = hash.hash(value);
        System.out.println(hash.getClass().getSimpleName() + ": " + result);
    }
}

运行结果如下:

JavaHash: 60fddbf
MurmurHash: a44a39a

1、服务实现类必须有无参构造子,ServiceLoader中直接使用Class.newInstance()进行实例化。
2、在Marven项目中,META-INF/services目录需放在在src/main/resources下。

3. SPI应用场景

SPI机制,在JDK中有多个应用场景,如Java Sound1Java File SystemsJava Image I/O等。

服务治理开源框架Dubbo2,也参考SPI实现了自己的扩展机制,方便使用者定义自己的Protocol、Filter等。

总体而言,SPI适用于在框架或工具包中预留扩展点,方便第三方实现自定义的服务。


wikipedia: Service provider interface
Java: ServiceLoader
Java spi机制浅谈

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值