Java插件扩展机制之SPI案例讲解

下面就为大家详细讲解“Java插件扩展机制之SPI案例讲解”的完整攻略。

什么是SPI机制

SPI是“Service Provider Interface”的缩写,意为“服务提供者接口”。SPI机制是Java对于插件化实现的一种支持机制,通过约定好的接口,供各个开发者来实现,并由Java自身的ClassLoader机制为我们实现接口的动态实现。

SPI机制的具体实现

1. SPI机制的约束条件

在Java中,对SPI机制的实现是有一定的约束条件的,这些条件主要包括:

  • 在Classpath下,服务接口的全限定名(class)必须保存在META-INF/services/目录下
  • 服务接口的实现类,必须为接口全限定名对应文件中,提供实现类的全限定名

2. SPI机制的应用示例

来通过一个实际的示例来介绍一下如何使用SPI机制。

比如,我们创建一个Jar包,并将这个Jar包放置到应用系统的Classpath路径下。这个Jar包中,我们提供了一个服务的接口com.test.service.UserService和实现类com.test.service.impl.UserServiceImpl

那么我们需要在这个Jar包的META-INF/services/目录下创建一个服务接口的文件com.test.service.UserService,并在这个文件的内容中填写实现类的全限定名com.test.service.impl.UserServiceImpl

此时,在我们调用UserService时,Java就会自动的去寻找 UserService 的的实现类,并将其实例化,返回给我们。这就是SPI机制的具体实现。

3. Java SPI机制的使用场景

Java SPI机制常常被应用于服务的扩展点。例如:

在开发应用时,我们可能需要为不同的数据库提供不同的连接驱动,不同的日志提供不同的实现等服务。这个时候,我们就可以通过SPI机制为这些服务提供扩展点,在Java程序运行时,让用户进行服务的实现。

这样,在源码实现项目时,就不用关心使用哪个具体的实现,这些实现都是由不同的服务提供商来完成的。同时,由这些不同的实现商来完成对访问进行治理和监控也是比较合适的。

示例1

假设现在我们有自己的发现服务的需求,现在有一个公共的接口需要开放,我们希望其他公司提供自己的实现。为此,我们就创建一个接口com.test.Discovery

public interface Discovery {
    void hello();
}

现在我们希望在我们的系统被调用的时候,能够提供一个扩展机制,这样我们就可以选择具体哪一个实现类。

我们创建一个项目叫做spi-server, 并创建一个实现类com.test.impl.DiscoveryImpl

public class DiscoveryImpl implements Discovery {
    public void hello() {
        System.out.println("hello from DiscoveryImpl");
    }
}

到现在为止,我们需要创建一个文件,告诉服务器其他公司的实现方式,这个文件的路径是META-INF/services/com.test.Discovery,内容是类名,如下:

com.test.impl.DiscoveryImpl

现在我们的discover功能已经准备就绪,我们只需要在服务器程序中通过SPI机制来获取对应的实现:

ServiceLoader<Discovery> serviceLoader = ServiceLoader.load(Discovery.class);
for (Discovery discovery : serviceLoader) {
    discovery.hello();
}

现在,当我们的系统被系统调入的时候,就会输出hello from DiscoveryImpl.

示例2

再来一个例子,我们希望让外部厂商来开展支付的组件,而我们实现调用接口。假设我们有一个初始的接口:

public interface Pay {
    void pay();
}

我们接下来就发布接口,并告诉外部厂商,它需要提供一个对应的实现。我们把接口打包后,把这个包交给外部厂商,让他们来编写实现。

外部厂商收到这个包后,需要创建一个类,实现这个接口:

public class AliPay implements Pay {
    public void pay() {
        System.out.println("Ali pay...");
    }
}

然后把这个AliPay类打包成Jar,我们现在需要把这个Jar放到CLASSPATH下,并在Jar包下的META-INF/services目录下,创建一个文件名为com.test.Pay的文件,把AliPay的实现类写入,作为相应接口的实现类。

然后,在我们的公司内部服务中,如下方式调用其中的AliPay:

ServiceLoader<Pay> load = ServiceLoader.load(Pay.class);
Iterator<Pay> iterator = load.iterator();
while (iterator.hasNext()) {
    Pay next = iterator.next();
    next.pay();
}

现在就可以轻松的实现不同外部的调用了。

阅读剩余 56%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java插件扩展机制之SPI案例讲解 - Python技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • SpringBoot应用程序转换成WAR文件详解

    下面是详细讲解“SpringBoot应用程序转换成WAR文件详解”的完整攻略。 背景介绍 Spring Boot 是一款简化 Spring 框架的开发过程的工具,它将我们从繁琐的配置中解放出来,让我们更专注于业务逻辑的开发上。然而,在实际的生产环境中,我们通常需要将 Spring Boot 应用程序转换成 WAR 文件来进行部署。本文将详细讲解如何将 Spr…

    Java 2023年5月19日
    00
  • ajax异步读取后台传递回的下拉选项的值方法

    当我们需要从后台获取选项的值时,可以使用Ajax异步请求来实现。其中,下拉选项的值可以通过后台接口获取到。 以下是实现该功能的具体步骤: 第一步:准备工作 在HTML中,我们需要创建一个下拉选项: <select id="selectBox"> <option value="">请选择</…

    Java 2023年5月20日
    00
  • Activiti开发环境的搭建过程详解

    Activiti开发环境的搭建过程详解 环境准备 在开始搭建Activiti开发环境之前,需要安装以下软件: JDK(Java Development Kit):用于编译和运行Java程序; Eclipse:Java开发工具; Maven:软件项目管理工具; Activiti插件:在Eclipse中安装。 JDK的安装和配置 下载JDK:从官方网站(http…

    Java 2023年5月19日
    00
  • java servlet获得客户端相关信息的简单代码

    好的。为了获得客户端相关信息,需要使用HTTP请求头中的一些信息。下面是获取客户端相关信息的简单代码及详细的攻略。 1.获取客户端IP地址 String ipAddress = request.getHeader("X-Forwarded-For"); if (ipAddress == null || ipAddress.length()…

    Java 2023年6月15日
    00
  • boot-admin整合flowable官方editor-app源码进行BPMN2-0建模(续)

    boot-admin整合flowable官方editor-app源码进行BPMN2-0建模(续)书接上回 项目源码仓库github项目源码仓库gitee boot-admin 是一款采用前后端分离模式、基于SpringCloud微服务架构的SaaS后台管理框架。系统内置基础管理、权限管理、运行管理、定义管理、代码生成器和办公管理6个功能模块,集成分布式事务S…

    Java 2023年4月22日
    00
  • Java实现读取项目中文件(.json或.properties)的方法详解

    下面我将为您详细讲解Java实现读取项目中文件(.json或.properties)的方法。 读取.properties文件的方法 1. 新建Properties对象并加载文件 Properties properties = new Properties(); InputStream inputStream = getClass().getClassLoad…

    Java 2023年5月20日
    00
  • 一篇文章带你搞定JAVA Maven

    一篇文章带你搞定JAVA Maven 什么是Maven? Maven是一款基于Java平台的构建工具,它可以帮助开发者自动化地构建、打包、发布和管理Java项目中的各种依赖。使用Maven可以大大简化Java项目的开发和维护。Maven有一个中心仓库,里面包含了主流的Java依赖。我们可以通过Maven来自动从中心仓库中下载所需的依赖,避免了手动下载和管理依…

    Java 2023年5月19日
    00
  • 在Java的Struts框架下进行web编程的入门教程

    在Java的Struts框架下进行web编程的入门教程 什么是Struts框架? Struts框架是基于Java Servlet和Java Server Pages技术的Web应用框架,提供了处理用户请求和生成响应的框架。它是MVC开发模式的一种实现,能够更好地分离应用程序的模型、视图和控制器。Struts在Web应用开发中已经非常成熟,并且拥有丰富的生态圈…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部