Java SPI(Service Provider Interface)最早是在Java SE 6中被引入的,作为一种标准的、用于在运行时发现和加载服务提供者插件的标准机制。以前的程序猿实现JDBC连接数据库都会自己写工具类加载不同厂商的驱动来实现数据库操作,但是随着JDBC4.0之后采用了Java SPI机制,这部分工作就变的轻松了,程序猿甚至不需要Driver的具体实现是什么,路径在哪里,会自动注册,直接使用即可。随着Java的版本升级,SPI机制的实现方式也有着一些变化,比如Java9开始,SPI的配置文件可以写在module-info.java文件中,但是之前的META-INF/services/目录下的仍然受支持。

万变不离其宗,其核心思想,和它的出现要解决某些问题的目标始终是一致的。包括经常使用的开源框架如Spring、Dubbo、Hibernate、Nacos、SLF4J等使用SPI机制来实现框架的可扩展性和插件化能力。原理是一样的,实现上各有千秋,开源框架的实现可能考虑的更加全面,更加灵活。

Oracle文档对于JAVA SPI的相关描述以及简单的Demo:https://docs.oracle.com/javase/tutorial/ext/basics/spi.html

相关例子和Demo类,此处不提供,参透JDBC在各个厂商的实现和配置,以及Spring中spring.factories用法,就能知道SPI是如何工作、如何使用的。

  • SPI不是一个框架,更不是一个具体实现,更偏向于是一种机制、规约。使用这种机制,遵循这种既定的规约,就可以提高系统的灵活性、可扩展性、模块化程度等。
  • 只要按照这个规约来实现,就能提供服务自动发现的能力。
    服务提供方只需要按照规范提供Metadata,SPI自动查找和加载对应的服务实现。也就是说客户端和服务端并不需要知道具体的实现累路径。比如自己在客户端使用Class.forName("cc.oo.tt.XX")来加载,那么每次是不是都要知道具体的实现的全路径名称。有了SPI就不需要知道,自动发现和加载。就像是一个策略模式的实现,不过具体的实现由扩展(三方)处理,同时按照服务规范在自己的jar中指定具体实现,而服务不需要知道。
  • 采用这种机制,我们可以更灵活的按需编码不同的实现,提供额外的扩展而不需要改原有的代码,从而提升了系统的稳定性。
  • 依据具体的场景,合适的时机来引入这种机制,而不是‘手里拿着锤子看什么都像钉子’,见了扩展就开始套用它。技术是为业务服务的,不是用来强行炫技的。

比如我们项目中有个模块是搜索点位信息,刚开始项目内置是采用数据库检索,后来是有很多三方也想集成进来,各自有自己的流程和处理方式,但是我们作为平台有自己标准的流程和标准的接口方式;那我们只需要讲接口定义提供给对方,让他们自己实现了接口的相关服务,并在提供给我们的jar中配置好具体实现类;我们项目中有专门扫描处理标准接口的函数,会依据不同项目加载不同的jar从而使用到三房提供的服务实现。


比如假设我门实现一个简单天气组件,目的就是查看各城市当天和未来天气,那提供天气的三方服务有很多,而实际上每次只需要一个服务可用就行,这时候就可以考虑采用Java SPI机制,将各个三方的服务按需集成,而不是全部混合到一起。

为什么要使用Java SPI机制的更多相关文章

  1. Java spi机制浅谈

    最近看到公司的一些框架和之前看到的开源的一些框架的一些服务发现和接入都采用了java的spi机制. 所以简单的总结下java spi机制的思想. 我们系统里抽象的各个模块,往往有很多不同的实现方案,比 ...

  2. JDK源码解析之Java SPI机制

    1. spi 是什么 SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件. 系统设计的各个抽象,往往 ...

  3. 聊聊Java SPI机制

    一.Java SPI机制 SPI(Service Provider Interface)是JDK内置的服务发现机制,用在不同模块间通过接口调用服务,避免对具体服务服务接口具体实现类的耦合.比如JDBC ...

  4. Java SPI机制实战详解及源码分析

    背景介绍 提起SPI机制,可能很多人不太熟悉,它是由JDK直接提供的,全称为:Service Provider Interface.而在平时的使用过程中也很少遇到,但如果你阅读一些框架的源码时,会发现 ...

  5. 组件化框架设计之Java SPI机制(三)

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将从深入理解java SPI机制来介绍组件化框架设计: ...

  6. Java SPI 机制实现解耦与本地化

    SPI 是 Java 提供的一种服务加载方式,全名为 Service Provider Interface,可以避免在 Java 代码中写死服务的提供者,而是通过 SPI 服务加载机制进行服务的注册和 ...

  7. Java SPI机制详解

    Java SPI机制详解 1.什么是SPI? SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制.SPI是一种动态替换发现的机制, 比如有个 ...

  8. java SPI机制

    1. SPI是Service Provider Interfaces的简称.根据Java的SPI规范,我们可以定义一个服务接口,具体的实现由对应的实现者去提供,即Service Provider(服务 ...

  9. Java SPI机制学习笔记

    最近在阅读框架源代码时,常常看到 SPI 的子包, 忍不住查了下: Service Provider Interface : 服务提供接口. JavaSPI 实际上是“基于接口的编程+策略模式+配置文 ...

  10. Java SPI机制简介

    SPI 简介 SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制. 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现 ...

随机推荐

  1. python路径相关操作:os.path

    Windows路径格式 import os # 当前python文件位置:T:\ProgrammingPractice\python_path\test.py # 给定的路径 path = r'D:\ ...

  2. Java for循环倒序输出

    1.实现一个for循环的倒序输出 在Java中,要实现一个for循环的倒序输出,通常我们会使用数组或集合(如ArrayList)作为数据源,然后通过倒序遍历这个数组或集合来实现.下面,我将给出一个详细 ...

  3. 全网最适合入门的面向对象编程教程:08 类和对象的Python实现-@property装饰器:把方法包装成属性

    全网最适合入门的面向对象编程教程:08 类和对象的 Python 实现-@property 装饰器:把方法包装成属性 摘要: 本文主要对@property 装饰器的基本定义.使用场景和使用方法进行了介 ...

  4. 【java深入学习第1章】深入探究 MyBatis-Spring 中 SqlSession 的原理与应用

    前言 在使用 MyBatis 进行持久层开发时,通常会与 Spring 框架集成,以便更好地管理事务和依赖注入.在 MyBatis-Spring 集成中,SqlSession 是一个非常重要的概念.本 ...

  5. 在ubuntu16.04下,源码编译安装特定版本的MongoDB PHP扩展

    背景:我的php项目在连接其他mongo库时报:Server at xxx:27017 reports wire version 5, but this version of libmongoc re ...

  6. 一键语法错误增强工具 ChineseErrorCorrector

    一键语法错误增强工具 欢迎使用我最近开源的使用一键语法错误增强工具,该工具可以进行14种语法错误的增强,不同行业可以根据自己的数据进行错误替换,来训练自己的语法和拼写模型,希望推动行业文本纠错的发展, ...

  7. [SDR] GNU Radio 系列教程 —— GNU Radio TX PDU (发送数据包操作)的基础知识(超全)

    目录 1 PDU 概述 2 Demo 详解 2.1 Random PDU Generator 2.2 Async CRC32 2.3 Protocol Formatter (Async) 2.4 将 ...

  8. 【GeoScene】一、创建、发布路网服务,并在代码中测试最短路径分析

    前言 网上关于GeoScene及GeoScene API for JavaScript的资料太少了,官方的技术支持又太慢了,最近把在项目中踩过的坑分享出来: **版本信息** GeoScene Pro ...

  9. JavaScript 中的闭包和事件委托

    包 (Closures) 闭包是 JavaScript 中一个非常强大的特性,它允许函数访问其外部作用域中的变量,即使在该函数被调用时,外部作用域已经执行完毕.闭包可以帮助我们实现数据的私有化.封装和 ...

  10. 【Python】Word文档操作

    依赖库下载: pip install python-docx -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install docx2pdf -i ...