简介
SPI全称(service provider interface),是JDK内置的一种服务提供发现机制,目前市面上有很多框架都是用它来做服务的扩展发现,如JDBC、日志框架。
简单来说,它是一种动态替换发现的机制。举个简单的例子,如果我们定义了一个规范,需要第三方厂商去实现,那么对于我们应用方来说,只需要集成对应厂商的插件,就可以完成对应规范的实现机制,形成一种插拔式的扩展手段。
举例
市面上手机有很多种类,手机可以用来打电话、发短信、上网等等。苹果手机实现了发短信的功能、安卓手机也实现了发短信的功能。但是他们的本质是不同的两款手机系统。
代码实现
1、有一个手机基本接口,可以用来发短信。新建一个工程:mobile-phone,里面定义一个接口MobilePhone,并将此工程打成jar包。
public interface MobilePhone {
/**
* 手机发送短信
* @return
*/
public String sendMsg(String msg);
}
2、新建一个工程:iphone,定义一个Iphone类,实现接口MobilePhone,并将此工程打成jar包。
public class IPhone implements MobilePhone {
@Override
public String sendMsg(String s) {
return "使用苹果手机发送了一条短信,内容为:"+s;
}
}
在resources目录下新建META-INF/services,在其目录下新建一个文件,文件名为:com.ft.spi.MobilePhone,文件内容为:com.ft.spi.IPhone。
pox.xml文件引入mobile-phone工程的jar包。
将此工程打成jar包。
3、新建一个工程:android-phone,定义一个AndroidPhone类,实现接口MobilePhone,并将此工程打成jar包。
public class AndroidPhone implements MobilePhone {
@Override
public String sendMsg(String s) {
return "使用安卓手机发送了一条短信,内容为:"+s;
}
}
在resources目录下新建META-INF/services,在其目录下新建一个文件,文件名为:com.ft.spi.MobilePhone,文件内容为:com.ft.spi.AndroidPhone。
pox.xml文件引入mobile-phone工程的jar包。
将此工程打成jar包。
4、新建一个工程:spi-test,添加测试类,pom.xml文件引入iphone工程和android-phone工程的jar包。
public class App
{
public static void main( String[] args ){
ServiceLoader<MobilePhone> serviceLoader=ServiceLoader.load(MobilePhone.class);
for(MobilePhone mobilePhone:serviceLoader){
System.out.println(mobilePhone.sendMsg("你好,spi!"));
}
}
}
//输入结果:
//使用苹果手机发送了一条短信,内容为:你好,spi!
//使用安卓手机发送了一条短信,内容为:你好,spi!