广告
返回顶部
首页 > 资讯 > 后端开发 > Python >JavaSPI机制详细介绍
  • 666
分享到

JavaSPI机制详细介绍

2024-04-02 19:04:59 666人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录为什么需要SPI?什么是SPI?SPI和api的区别来人,上点对抗spi-providerspi-user总结为什么需要SPI? 思考一个场景,我们封装了一套服务,别人通过引入我

为什么需要SPI?

思考一个场景,我们封装了一套服务,别人通过引入我们写好的包,就可以使用这些接口API,完成相应的操作,这本来没有什么问题,但是会存在使用该服务的实体有不相同的业务需求,需要进一步的扩展,但是由于api是写好的,想要扩展并非那么的简单,如果存在这样子的场景,我们该怎么办?

可以使用Java 提供的SPI机制

什么是SPI?SPI和API的区别

SPI

SPI的全称是Service Provider Interface,是Java提供的可用于第三方实现和扩展的机制,通过该机制,我们可以实现解耦,SPI接口方负责定义和提供默认实现,SPI调用方可以按需扩展

API的全称是Application Programming Interface,广义上来看就是接口,负责程序与程序之间进行协作的通道,就好比上面给的例子,【我们封装好了一套服务,通过API的形式提供给他人使用,别人使用API就能得到想要的】

所以他们俩的区别就很明显了,API的调用方只能依赖使用提供方的实现,SPI就如同可定制化的API一样,调用方可以自定义实现替换API提供的默认实现

来人,上点对抗

首先,我们新建一个空的Maven项目,里边有两个包

spi-provider从名字就可以得知是SPI的提供方

spi-user SPI的使用方

spi-provider

我们简单定义一个SPI接口,就叫ISpiTest,里边就一个saySomething方法,再提供一个默认的实现


public interface ISpiTest {
	void saySomething();
}

public class DefaultSpiImplementation implements ISpiTest{
	@Override
	public void saySomething() {
		System.out.println("[默认实现] -> 今天也是充满希望的一天");
	}
}

然后,模拟走流程,注意步骤4是我们之后要自定义替换的



public class TestUtils {
	
	public static void workFlow(ISpiTest s) {
		
		System.out.println("1、步骤1.......");
		System.out.println("2、步骤2.......");
		System.out.println("3、步骤3.......");
		System.out.print("4、步骤4:");
		s.saySomething();
		System.out.println("5、步骤5.......");
	}
}

接着,重点来了,我们需要在resources目录下面创建/META-INF/services文件夹,然后以SPI接口的全限定类名作为名称创建一个文件

往文件里面填写实现类的全限定类名,如下


com.amg.spi.DefaultSpiImplementation

到此,spi-provider这个模块就完成了,至于之后要怎么使用,到spi-user模块中进一步说明

spi-user

首先,我们在pom文件中,引入spi-provider坐标依赖

​然后定义main方法,在main方法中调用在spi-provider中定义的SPI接口,此时采用的是默认的配置

可以注意到我们使用ServiceLoader这个类的load方法,传入SPI接口的字节码进行构造,我们在spi-provider中resources中给出了一个默认实现,但是我们是在spi-user中去调用的,ServiceLoader会自动读取META-INF下的配置文件,就算是跨jar包也是可以的

然后现在我们在spi-user中定义一个实现类,以及把他配置到META-INF下(需要注意,这个配置的全限定类名仍然需要是spi-provider中定义SPI接口的路径),来看看效果

spi-user下META-INF里边内容如下


com.amg.spiuser.service.impl.WantHamburger

可以发现,我们并没有改变任何的客户端代码,只是把配置文件进行了简单的修改,即可完成自定义实现,这就是使用SPI的魅力

?思考一下,我们之前的流程是怎么做的

首先定义了一个接口,面向接口编程嘛定义配置文件各个自定义的实现类,只需要按照规则重写配置文件即可

总结

通过这个流程,我们可以归纳为一句话,SPI是策略模式的一种体现,配合面向接口编程的思想以及必要的配置文件,即可完成定义和具体实现的解耦,而且是可定制化的API

SPI的优点有以下

定制化实现接口解耦

SPI的缺点有以下

通过观察ServiceLoader,可以发现并没有额外的加机制,所以会存在并发问题获取对应的实现类不够灵活,从上面例子可以看出,需要使用迭代器的方式获取需要知道接口的所有具体实现类,所以每次都要加载和实例化所有的实现类

实际中,SPI的使用还是很常见的,例如dubboSpring Boot都为我们提供了一套SPI机制,只不过此SPI是在Java提供的SPI机制基础上进行改造而来,有兴趣的同学也可以去查下资料,增长增长

到此这篇关于Java SPI机制详细介绍的文章就介绍到这了,更多相关Java SPI机制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaSPI机制详细介绍

本文链接: https://www.lsjlt.com/news/159594.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaSPI机制详细介绍
    目录为什么需要SPI?什么是SPI?SPI和API的区别来人,上点对抗spi-providerspi-user总结为什么需要SPI? 思考一个场景,我们封装了一套服务,别人通过引入我...
    99+
    2022-11-12
  • java反射机制详细介绍
    一、什么是JAVA的反射机制(推荐:java视频教程)Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifie...
    99+
    2015-08-04
    java
  • JavaScript执行机制详细介绍
    目录1.进程与线程的概念 2.浏览器原理 3.同步与异步 4.执行栈与任务队列 5.事件循环(Event-Loop) 6.定时器 前言: 不论是工作还是面试,我们可能都经常会碰到需...
    99+
    2022-11-12
  • SpringBoot详细介绍SPI机制示例
    目录简介Java SPI实现示例说明创建动态接口实现类1实现类2相关测试运行结果源码分析Spring SPI源码分析总结简介 SPI(Service Provider Interfa...
    99+
    2022-11-13
  • java类加载机制详细介绍
    文章转载自:http://www.pythonheidong.com/blog/article/1152/在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题:class Grandpa{ static ...
    99+
    2019-02-20
    java教程 java
  • Javascript继承机制的详细介绍
    这篇文章主要介绍“Javascript继承机制的详细介绍”,在日常操作中,相信很多人在Javascript继承机制的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ja...
    99+
    2022-10-19
  • MySQL Innodb索引机制详细介绍
    1、什么是索引 索引是存储引擎用于快速找到记录的一种数据结构。 2、索引有哪些数据结构 顺序查找结构:这种查找效率很低,复杂度为O(n)。大数据量的时候查询效率很低。 ...
    99+
    2022-11-12
  • Java 类加载机制详细介绍
    一、类加载器  类加载器(ClassLoader),顾名思义,即加载类的东西。在我们使用一个类之前,JVM需要先将该类的字节码文件(.class文件)从磁盘、网络或其他来源加载到内存中,并对字节码进行解析生成对应的Class对象,这就是类加...
    99+
    2023-05-31
    java 加载机制
  • Java异常机制的详细介绍
    本篇内容主要讲解“Java异常机制的详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java异常机制的详细介绍”吧!1.异常的概述1.1什么是异常?异常:程序在运行过程中发生由于外部问题导...
    99+
    2023-06-02
  • 对于java反射机制的详细介绍
    本文由java编程入门栏目为大家详细介绍java中的反射机制,希望可以帮助到对于此机制有所不懂的同学。java反射机制是运行状态中,对于任意一个类都能够知道这个类的所有属性和方法(包括私有的);对于任意一个对象,都能调用他的任意方法和属性;...
    99+
    2019-02-22
    java入门 java 反射机制
  • 详细介绍Android中回调函数机制
    提示:在阅读本文章之前,请确保您对Touch事件的分发机制有一定的了解 在Android的学习过程中经常会听到或者见到“回调”这个词,那么什么是回调呢?所谓的回调函数就是:在A...
    99+
    2022-06-06
    回调 函数 回调函数 Android
  • JAVASPI机制详解使用方法
    目录写在前面什么是SPI使用场景实现约定四种角色基于JAVA原生特性实现的JAVA SPI机制的DEMO1. 主要角色2. 示例代码3. 说明基于SPRING BOOT实现的JAVA...
    99+
    2022-11-13
  • python流程控制详细介绍
    目录1. 布尔逻辑1.1 条件控制语句-if1.2 if/else 语句1.3 if/elif 语句2 循环控制语句2.1 循环控制之for2.2 循环控制之while3 for v...
    99+
    2022-11-12
  • MySQL主从复制详细介绍
    一、主从复制的目的 ​ MySQL内建的复制功能是构建基于MySQL的大规模、高性能应用的基础,复制功能的目的是构建高性能的应用,同时也是高可用性、可扩展性、灾难恢复、备份以及数据仓库等工作的基础。比较常见的用途有以下几种: 数据分布:备份...
    99+
    2023-08-20
    mysql 数据库 服务器
  • JAVA虚拟机(JVM)详细介绍(五)——类加载机制
    上篇中我们讲解了Class文件,这篇我们说说虚拟机是如何加载这些Class文件的?Class文件中的信息进入到虚拟机后会发生什么变化?这就涉及到了类加载机制。类加载机制是把类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始...
    99+
    2015-12-28
    java教程 JVM
  • OAuth2 详细介绍!
    目录 一、文章介绍 二、OAth2 2.1 简介 2.2 OAuth2  授权总体流程 2.3 四种授权模式 1.授权码模式 2.简化模式 3.密码模式 4. 客户端模式 2.4 OAuth2 标准接口 2.5 GitHub 授权登录 1...
    99+
    2023-09-15
    github java
  • springMVC详细介绍
    目录springMVC简介SpringMVC框架的优点第一个SpringMVC程序第一步:创建maven-web项目第二步:在pom.xml中添加依赖和插件第三步注册中央调度器第四步...
    99+
    2022-11-12
  • DockerCompose详细介绍
    目录一、Docker Compose的安装二、Docker Compose的基本使用三、Docker Compose的高级功能四、总结一、Docker Compose的安装 Dock...
    99+
    2023-05-16
    Docker Compose详解 Docker Compose
  • JAVA虚拟机(JVM)详细介绍(三)——垃圾收集机制
    在上一篇中我们说过,自动内存管理分为两部分:给对象分配内存和回收分配给对象的内存。这篇我们说说后者,即回收分配给对象的内存。回收内存要用到垃圾收集机制,英文名儿是GC(Garbage Collection)。在本部分我们要解决如下几个问题:...
    99+
    2017-01-27
    java教程 JVM
  • Jetpack Compose Canvas绘制超详细介绍
    目录1. Canvas2. 绘制方法1. drawLine2. drawRect3. drawRoundRect4. drawImage5. drawCircle6. drawArc...
    99+
    2022-11-13
    Jetpack Compose Canvas Jetpack Canvas绘制
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作