在java中使用SPI实现创建一个可扩展的应用程序

  介绍

今天就跟大家聊聊有关在java中使用SPI实现创建一个可扩展的应用程序,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

<强> SPI简介

SPI的全称是java服务提供者接口。是java提供的一种服务发现的机制。

通过遵循相应的规则编写应用程序之后,就可以使用即便ServiceLoader来加载相应的服务了。

<强> SPI的实现主要分为4个部分:

服务提供者接口:SPI是一个接口或者是抽象类,其中定义了我们需要扩展实现的功能。

服务提供商:这是SPI的具体实现,提供了具体的实现功能

SPI配置文件:SPI的配置文件,通过在配置文件我们来配置相关的SPI发现信息。

即便ServiceLoader:即便ServiceLoader是用来加载和发现服务的java类,并提供了很多有用的方法。

<强> SPI的普通java实现

讲完SPI的定义,大家可能还是不清楚SPI到底是做什么的,又该怎么使用它。

不用急,我们下面通过一个例子来说明。

首先创建一个模块:SPI-service,里面主要定义了一个ModuleService接口:

公共接口ModuleService {

}

霸趈ava中使用SPI实现创建一个可扩展的应用程序"

然后再分别创建两个模块,作为ModuleService的实现:

公共类ModuleServiceB实现ModuleService {
  
  公共ModuleService getModuleService () {
  返回新ModuleServiceB ();
  }
  }

接着分别在两个模块中创建meta - inf/服务文件夹,并且在里面创建两个以服务提供程序接口限定名为名字的文件,这里文件名是:com.flydean.base.service.ModuleService,文件里面存放的是SPI的具体实现类:

com.flydean.base.servicea.ModuleServiceA

com.flydean.base.serviceb。ModuleServiceB

霸趈ava中使用SPI实现创建一个可扩展的应用程序"

霸趈ava中使用SPI实现创建一个可扩展的应用程序"

最后,我们需要创建一个使用SPI的类:

公共类ModuleController {
  
  公共静态void main (String [] args) {
  ListmoduleServices=即便ServiceLoader
  .load (ModuleService.class) .stream ()
  . map (ServiceLoader.Provider::拿)
  .collect (toList ());
  log.info (“{}”, moduleServices);
  }
  }

霸趈ava中使用SPI实现创建一个可扩展的应用程序"

为了更好的展示扩展应用的实际使用,我们分别创建4个模块。在实际应用中,只需要将这些jar包加入应用程序的类路径即可。

运行看下输出结果:

[com.flydean.base.servicea.ModuleServiceA@16f65612,

com.flydean.base.serviceb.ModuleServiceB@311d617d]

从结果看的到,我们获得了两个ModuleService。证明系统扩展成功。

<强> SPI在摩根大通模块化系统下的实现

上面我们讲的是基本的操作,考虑一下,如果是在JDK9之后,引入了摩根大通模块化系统之后,应该怎么使用SPI呢?

代码肯定是一样,我们需要修改的是SPI配置文件。

如果在摩根大通中,我们就不需要使用meta - inf/服务了,我们只需要创建相应的module-info.java文件即可。

先看下SPI模块的模块信息。java文件:

模块。服务{   出口com.flydean.service;   }

这个模块我们对外暴露了服务包,供其他模块调用。

霸趈ava中使用SPI实现创建一个可扩展的应用程序"

接下来是SPI的实现模块:

 

在java中使用SPI实现创建一个可扩展的应用程序