笔记篇-浅谈Java Service Porvider Interface (SPI)

1520180837560.jpeg

简介

一个可扩展的应用程序是一个您可以在不修改其原始代码库的情况下进行扩展的应用程序。您可以使用新的插件或模块来增强其功能。开发人员、软件供应商和客户可以通过在应用程序类路径或特定于应用程序的扩展目录中添加新的Java存档(JAR)文件来添加新功能或应用程序编程接口(api)。

本节介绍如何使用可扩展服务创建应用程序,这些服务使您或其他人能够提供不需要修改原始应用程序的服务实现。通过设计可扩展的应用程序,您可以提供一种在不更改核心应用程序的情况下升级或增强产品特定部分的方法。

可扩展应用程序的一个示例是允许最终用户添加新词典或拼写检查器的字处理器。在本例中,字处理器提供了字典或拼写功能,其他开发人员甚至客户可以通过提供自己的功能实现来扩展该功能。

以下是理解可扩展应用程序的重要术语和定义:

  • 服务(Service)

    提供对某些特定应用程序功能或特性的访问的一组编程接口和类。服务可以定义功能的接口和检索实现的方法。在字处理器示例中,字典服务可以定义检索字典和单词定义的方法,但它不实现底层功能集。相反,它依赖于服务提供商来实现该功能。

  • 服务提供商接口(SPI)

    服务定义的一组公共接口和抽象类。SPI定义了应用程序可用的类和方法。

  • 服务提供商实现SPI

    具有可扩展服务的应用程序使您、供应商和客户能够添加服务提供者,而无需修改原始应用程序。

案例

1.定义接口

1
2
3
4
5
package com.example.spidemo.service;

public interface Call {
public void call();
}

2.编写实现类

1
2
3
4
5
6
7
8
9
10
11
12
13

public class CatCall implements Call {
public void call() {
System.out.println("cat Call Service Impl");
}
}

public class BirdCall implements Call {
public void call() {
System.out.println("Bird Call Service Impl");
}
}

3.配置SPI

1
2
3
在resource下创建META-INF/services文件夹
创建以接口全类名命名的文件
将接口实现类的全类名写入该文件

4.运行查看结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.example.spidemo;

import com.example.spidemo.service.Call;
import com.sun.tools.javac.util.ServiceLoader;


public class Main {

public static void main(String[] args) throws Exception{
ServiceLoader<Call> loaders = ServiceLoader.load(Call.class);
for (Call call : loaders) {
call.call();
}
}
}

5.结果如下
image.png

资料

官方文档:https://docs.oracle.com/javase/tutorial/ext/basics/spi.html


笔记篇-浅谈Java Service Porvider Interface (SPI)
https://mikeygithub.github.io/2021/07/21/yuque/笔记篇-浅谈 Java SPI/
作者
Mikey
发布于
2021年7月21日
许可协议