美文网首页
在java中使用SPI创建可扩展的应用程序

在java中使用SPI创建可扩展的应用程序

作者: 农哥小鹏 | 来源:发表于2020-08-24 23:01 被阅读0次

简介

什么是可扩展的应用程序呢?可扩展的意思是不需要修改原始代码,就可以扩展应用程序的功能。我们将应用程序做成插件或者模块。

这样可以在不修改原应用的基础上,对系统功能进行升级或者定制化。

本文将会向大家介绍如何通过java中的SPI机制实现这种可扩展的应用程序。

SPI简介

SPI的全称是Java Service Provider Interface。是java提供的一种服务发现的机制。

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

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

Service Provider Interface: SPI是一个interface或者是抽象类,其中定义了我们需要扩展实现的功能。

Service Providers:这是SPI的具体实现,提供了具体的实现功能

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

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

SPI的普通java实现

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

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

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

publicinterfaceModuleService{}

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

publicclassModuleServiceAimplementsModuleService{publicModuleServicegetModuleService(){returnnewModuleServiceA();    }}publicclassModuleServiceBimplementsModuleService{publicModuleServicegetModuleService(){returnnewModuleServiceB();    }}

接着分别在两个module中创建META-INF/services文件夹,并且在里面创建两个以 Service Provider Interface限定名为名字的文件,这里文件名是:com.flydean.base.service.ModuleService,文件里面存放的是SPI的具体实现类:

com.flydean.base.servicea.ModuleServiceAcom.flydean.base.serviceb.ModuleServiceB

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

publicclassModuleController{publicstaticvoidmain(String[] args){        List<ModuleService> moduleServices = ServiceLoader                .load(ModuleService.class).stream().map(ServiceLoader.Provider::get)                .collect(toList());log.info("{}", moduleServices);    }}

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

运行看下输出结果:

[com.flydean.base.servicea.ModuleServiceA@16f65612,com.flydean.base.serviceb.ModuleServiceB@311d617d]

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

SPI在JPMS模块化系统下的实现

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

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

如果在JPMS中,我们就不需要使用META-INF/services了,我们只需要创建相应的module-info.java文件即可。

先看下SPI模块的module-info.java文件:

modulecom.flydean.service {    exports com.flydean.service;}

这个模块我们对外暴露了service package,供其他模块调用。

接下来是SPI的实现模块:

modulecom.flydean.servicea {requirescom.flydean.service;providescom.flydean.service.ModuleService with com.flydean.servicea.ModuleServiceA;exportscom.flydean.servicea;}

这里我们使用了provides命令,定义了两个类的关联关系。

最后是调用的模块:

modulecom.flydean.controller {usescom.flydean.service.ModuleService;requirescom.flydean.service;requireslombok;requiresslf4j.api;}

这里我们使用uses关键词来引用ModuleService。

相关文章

  • 在java中使用SPI创建可扩展的应用程序

    简介 什么是可扩展的应用程序呢?可扩展的意思是不需要修改原始代码,就可以扩展应用程序的功能。我们将应用程序做成插件...

  • 在java中使用SPI创建可扩展的应用程序

    简介 什么是可扩展的应用程序呢?可扩展的意思是不需要修改原始代码,就可以扩展应用程序的功能。我们将应用程序做成插件...

  • Dubbo SPI

    Java提供了SPI机制(ServiceLoader)来进行服务发现,而Dubbo中的扩展点同样使用了SPI机制进...

  • dubbo的spi机制

    SPI SPI是一种扩展机制,在java中SPI机制被广泛应用,比如Spring中的SpringServletCo...

  • 使用比特币RPC客户端创建比特币java应用程序

    你可以使用RPC客户端在Java中创建有扩展性的比特币应用程序。在这篇博客中,我们将使用JavaBitcoindR...

  • dubbo的spi机制

    dubbo的spi机制 dubbo的扩展点加载机制源自于java的spi扩展机制。那么,何为java的spi扩展机...

  • dubbo spi机制源码阅读

    dubbo的扩展能力很强大。他是通过扩展Java的spi机制得到的。 Java Spi机制介绍 SPI是Servi...

  • springboot SPI 扩展机制

    springboot的扩展解耦,仿照java的SPI机制,使用SpringFactoriesLoader加载spr...

  • JAVA SPI解析

    JAVA SPI解析 在阅读Dubbo源码时发现Dubbo针对java的spi机制做了扩展。那么spi究竟是什么呢...

  • Dubbo SPI 机制解析

    从上一篇 Java SPI 机制解析 可以知道 Java SPI 的一些劣势。Dubbo 的扩展点加载从 Java...

网友评论

      本文标题:在java中使用SPI创建可扩展的应用程序

      本文链接:https://www.haomeiwen.com/subject/zviojktx.html