java spi机制简介
java的spi是一种服务发现机制,很多文章中介绍spi机制的时候都会说一句类似spring框架的IOC容器。就作者在实际的工作过程中发现没有什么类比性。SPI源语的全称是“Service Provider Interface”,即“服务提供者的接口”,该接口的使用者是服务提供方,谁提供服务谁使用spi接口。该机制的经典使用案例是jdbc框架,一个优秀的基于此框架扩展的是dubbo框架。在作者公司的产品中也使用了该框架,主要用于外设集成以及逻辑扩展框架中。
一个简单的示例
资源管理器中的目录内容
Eclipse中的资源浏览器
主方法中的代码如下:
package com.ganyp.demo.spi;
import java.util.Iterator;
import java.util.ServiceLoader;
public class App {
public static void main(String[] args) {
ServiceLoader<ISimpleService> sl = ServiceLoader.load(ISimpleService.class);
Iterator<ISimpleService> payItertor = sl.iterator();
System.out.println("-----------start-----------");
while(payItertor.hasNext()){
ISimpleService pay = payItertor.next();
pay.say();
}
System.out.println("-----------end-----------");
}
}
ISimpleService接口中的方法定义
package com.ganyp.demo.spi;
public interface ISimpleService {
public String say();
}
一个简单的接口实现方法
package com.ganyp.demo.spi.impl;
import com.ganyp.demo.spi.ISimpleService;
public class SimpleServiceImpl implements ISimpleService{
@Override
public String say() {
System.out.println("SimpleServiceImpl say hello!");
return null;
}
}
以下是重点
要想使用中能够获取到接口定义的服务还比如让调用方能够定位到服务提供方。spi的机制是使用jdk中的工具类ServiceLoader来搜索服务实现,服务实现方在自己的jar文件下的META-INF目录中增加services目录,并且在该文件夹下面新建一个spi接口的全路径文件,如图所示
需要注意的是该文件是没有后缀的,就是接口的全限定名称,文件中的内容就是接口的实现类全限定名称。示例:com.ganyp.demo.spi.impl.SimpleServiceImpl