简介
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,你去看它的源码,应该也是支持应用覆盖它的原生实现类的。
来源:oschina
链接:https://my.oschina.net/u/2763531/blog/2878546