java_SPI机制

荒凉一梦 提交于 2021-01-04 04:02:47

简介

SPI(Service Provider Interface)服务提供接口,是指的一种服务发现机制,为某个特定的接口寻找服务的实现。在大规模的软件开发中经常采用这样的机制,实现模块之间基于接口编程,隐藏其实现细节,不同的服务提供商进行扩展实现,最终实现无需修改代码即可调用,实现完全无代码入侵。

使用

创建一个接口:

public interface TestSpiService {
    void doSomething();
}

创建两个实现类:

public class TestSpiServiceImpl1 implements TestSpiService {

    @Override
    public void doSomething() {
        System.out.println("TestSpiServiceImpl1");
    }

}
public class TestSpiServiceImpl2 implements TestSpiService {

    @Override
    public void doSomething() {
        System.out.println("TestSpiServiceImpl2");
    }

}

然后在src/main/resources/目录下创建子目录META-INF/services.创建一个以接口全限定名com.xll.spi.TestSpiService为文件名的文件。 内容就是具体的实现类:

com.xll.spi.TestSpiServiceImpl1
com.xll.spi.TestSpiServiceImpl2

测试调用实现类;

public class Test {
    public static void main(String[] args) {
        ServiceLoader<TestSpiService> load = ServiceLoader.load(TestSpiService.class);
        Iterator<TestSpiService> iterator = load.iterator();
        while (iterator.hasNext()) {
            TestSpiService service = iterator.next();
            service.doSomething();
        }
    }
}

应用场景

SPI机制一般用在插件扩展的场景:比如说你开发的是一个给别人使用的开源框架,如果你想让别人自己写个插件,插到你的开源框架里面来,扩展某个功能.
经典的思想体现:比如说jdbc.java定义了一套jdbc的接口,但是java是没有提供jdbc的实现类.但是实际上项目跑的时候,要使用jdbc接口的哪些实现类呢?一般来说,我们要根据自己使用的数据库,比如msyql,你就将mysql-jdbc-connector.jar,引入进来;oracle,你就将oracle-jdbc-connector.jar,引入进来。
在系统跑的时候,碰到你使用jdbc的接口,他会在底层使用你引入的那个jar中提供的实现类.

应用案例

dubbo 基于jdk的spi机制实现了自己的一套spi机制,让用户扩展dubbo的默认实现。 具体可以看dubbo的源码。

还有比如说fastjson,你去看它的源码,应该也是支持应用覆盖它的原生实现类的。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!