Java SPI机制原理及代码实例
SPI全称Service Provider Interface。在Java中,SPI是一种以插件化的方式来实现程序的可扩展性的机制,它允许第三方程序向已有的程序添加功能或者替换原有的功能。
SPI的机制原理
SPI机制的基本原理是,一些具有相同接口的服务类,定义了一组标准与规范,由服务提供者实现,以供调用方调用。调用者通过查找和加载这些服务提供者,并调用接口提供的方法,来实现与业务相关的逻辑。
SPI机制包含三个部分:
-
服务接口(service interface):一组固定的接口规范。
-
服务提供者实现(service provider implementation):实现服务接口的类。
-
服务加载器(service loader):用来加载实现接口规范的类。
代码实例1
以下代码介绍服务接口的定义和服务提供者的实现:
定义服务接口:
public interface HelloService {
void sayHello();
}
实现HelloService接口的两个服务提供者:
public class ChineseHelloServiceImpl implements HelloService {
@Override
public void sayHello() {
System.out.println("你好!");
}
}
public class EnglishHelloServiceImpl implements HelloService {
@Override
public void sayHello() {
System.out.println("Hello!");
}
}
在src/main下的resources目录下新建文件夹META-INF/services,其中/services下的文件名为服务接口的全限定类名,如本例中的com.example.demo.HelloService,文件内容为服务提供者的全限定类名,多个服务提供者使用换行符分隔,如下所示:
com.example.demo.ChineseHelloServiceImpl
com.example.demo.EnglishHelloServiceImpl
服务加载代码:
public class HelloServiceLoader {
public static void main(String[] args) {
ServiceLoader<HelloService> serviceLoader = ServiceLoader.load(HelloService.class);
Iterator<HelloService> iterator = serviceLoader.iterator();
while (iterator.hasNext()) {
HelloService helloService = iterator.next();
helloService.sayHello();
}
}
}
最终的输出结果是:
你好!
Hello!
代码实例2
以下代码介绍服务接口的定义和普通类对接口的实现:
定义服务接口:
public interface FormatService {
String format(String str);
}
实现FormatService接口的普通类:
public class JsonFormatServiceImpl implements FormatService {
@Override
public String format(String str) {
JSONObject jsonObject = new JSONObject(str);
return jsonObject.toString();
}
}
实现FormatService接口的普通类也可以由SPI加载器加载,只需要在src/main下的resources目录下新建文件夹META-INF/services,其中/services下的文件名为服务接口的全限定类名,如本例中的com.example.demo.FormatService,文件内容为服务提供者的全限定类名,多个服务提供者使用换行符分隔,如下所示:
com.example.demo.JsonFormatServiceImpl
服务加载代码:
public class FormatServiceLoader {
public static void main(String[] args) {
ServiceLoader<FormatService> serviceLoader = ServiceLoader.load(FormatService.class);
Iterator<FormatService> iterator = serviceLoader.iterator();
while (iterator.hasNext()) {
FormatService formatService = iterator.next();
System.out.println(formatService.format("{\"name\":\"张三\",\"age\":18,\"gender\":\"男\",\"address\":\"北京市通州区\"}"));
}
}
}
最终的输出结果是:
{"age":18,"gender":"男","address":"北京市通州区","name":"张三"}
通过上述例子可以看出,SPI机制能为Java程序的扩展性提供良好的支持,方便开发者灵活的扩展和替换程序的功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java SPI机制原理及代码实例 - Python技术站