ServiceLoader : JAVA SPI 机制

本文介绍了 Java SPI 机制的基本概念及其实现原理。通过示例展示了如何定义接口、创建实现类并通过配置文件指定这些实现类,最后通过 ServiceLoader 加载并实例化这些服务实现。

SPI的全名为Service Provider Interface.普通开发人员可能不熟悉,因为这个是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介绍。

简单来说就是通过配置文件指定接口的实现类。

当我们开发一套框架、一套机制、一个插件或一套API时候,如果需要第三方的服务支持,可以直接写死到代码里面,但这种方式耦合太强,不利于切换到其它服务,好的方法是写一个配置文件指定服务的实现方,幸运的是java的spi机制已经帮我们做好了,示例用法如下:

一个接口:

package testws;

public interface TestEJB {
    void test(String data) throws Exception;
    void test0(String data) throws Exception;
}
第一个实现类:

package testws;

public class MyTest implements TestEJB {
    public void test(String data) throws Exception {
        System.out.println("my test:" + data);
    }

    public void test0(String data) throws Exception {
        System.out.println("test0:" + data);
    }
}
第二个实现类:

package testws;

public class MyTest2 implements TestEJB {
    public void test(String data) throws Exception {
        System.out.println("my test2222:" + data);
    }

    public void test0(String data) throws Exception {
        System.out.println("test02222222:" + data);
    }
}

建立 META-INF 文件夹,在其里面建立 services 文件夹,在services文件夹下建立一个文件,名称为我们需要实现的服务的全类名,即:testws.TestEJB

文件testws.TestEJB的内容如下:(PS:如果我们只需要一个实现类,下面可以只写一个,每一个实现类占一行)

testws.MyTest
testws.MyTest2

最后一个步骤:将三个java类和META-INF 文件夹打包到一个jar中,就可以使用了,使用方式:

import java.util.ServiceLoader;

public class TestSPI {
    public static void main(String[] args) {
        ServiceLoader<TestEJB> loadedImpl = ServiceLoader.load(TestEJB.class);
        for (TestEJB testEJB : loadedImpl) {
            System.out.println(testEJB.getClass());
            try {
                testEJB.test("a");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

打印如下:

class testws.MyTest
my test:a
class testws.MyTest2
my test2222:a


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值