首页 > 编程语言 > 详细

Java SPI 机制

时间:2020-12-29 18:23:43      阅读:23      评论:0      收藏:0      [点我收藏+]

SPIService Provider Interface) 服务提供发现接口。

不同于微服务中的服务发现,其本质是典型的面向接口编程,也就是解耦。

同时SPI 使用的是一种 ”插件思维“,即服务提供者负责服务所有的维护,当替换服务提供方时不需要调用方修改代码及配置文件。

 

组成:

  服务:指接口和抽象类的集合。由服务调用方提供

  服务提供者:是服务的特定实现

    服务提供者可以以扩展的形式安装在Java平台的实现中,也就是将 jar 文件放入任意常用的扩展目录中。也可通过将提供者加入应用程序类路径路径,或者通过其他某些特定于平台的方式使其可用。

技术分享图片

 

SPI规范:

1、在资源目录 resource/META-INF/services 中放置提供者配置文件 来标识服务提供者。文件名称是服务类型(接口)的全限定名(最终会通过这里的全限定名来反射创建对象)。

2、该文件包含一个具体提供者类的全限定名,每行一个。忽略各名称周围的空格、制表符和空行。可以使用 ‘#’ 标注注释。

3、该文件必须使用UTF-8编码

 

服务加载器:

java.util.ServiceLoader<S>

  JDK官方提供的SPI机制下的服务加载器,S:要被此加载器加载的服务类型

返回 方法名 描述
Iterator<S>  iterator()  以延迟方式加载此加载器服务的可用提供者。
static <S> ServiceLoader<S>  load(Class<S> service)  针对给定服务类型创建新的服务加载器,使用当前线程的上下文类加载器。
static <S> ServiceLoader<S>  load(Class<S> service, ClassLoader loader)  针对给定服务类型和类加载器创建新的服务加载器。 
static <S> ServiceLoader<S>  loadInstalled(Class<S> service)  针对给定服务类型创建新的服务加载器,使用扩展类加载器。
void  reload()  清除此加载器的服务者缓存,以重载所有服务者。 
String  toString()  返回一个描述此服务的字符串。

    
     

示例:

mysql-connector-java-5.1.47.jar为例

 1、接口服务Driver,全限定名为:

   java.sql.Driver

 2、服务配置

   在其jar包的META-INF/services/ 目录下有个 java.sql.Driver 文件,内容为:

    com.mysql.jdbc.Driver
    com.mysql.fabric.jdbc.FabricMySQLDriver

  技术分享图片

 3、调用方使用ServiceLoader加载所有提供的服务 (java.sql.DriverManager中的static{loadInitialDrivers();})

  技术分享图片

 

 

 

Dubbo SPI:

  http://dubbo.apache.org/docs/v2.7/dev/spi/

Java SPI 机制

原文:https://www.cnblogs.com/yangyongjie/p/14201881.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!