首页 > 其他分享 >SPI技术

SPI技术

时间:2023-08-05 19:22:30浏览次数:36  
标签:Java String 实现 技术 接口 SPI public

1. SPI 简介

SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。

Java 中 SPI 机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是解耦。

API (Application Programming Interface)在大多数情况下,都是实现方制定接口并完成对接口的实现,调用方仅仅依赖接口调用,且无权选择不同实现。 从使用人员上来说,API 直接被应用开发人员使用。

SPI (Service Provider Interface)是调用方来制定接口规范,提供给外部来实现,调用方在调用时则选择自己需要的外部实现。 从使用人员上来说,SPI 被框架扩展人员使用。

系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制

Java SPI 有四个要素:

  • SPI 接口: 为服务提供者实现类约定的的接口或抽象类。
  • SPI 实现类: 实际提供服务的实现类。
  • SPI 配置: Java SPI 机制约定的配置文件,提供查找服务实现类的逻辑。配置文件必须置于 META-INF/services 目录中,并且,文件名应与服务提供者接口的完全限定名保持一致。文件中的每一行都有一个实现服务类的详细信息,同样是服务提供者类的完全限定名称。
  • ServiceLoader: Java SPI 的核心类,用于加载 SPI 实现类。ServiceLoader 中有各种实用方法来获取特定实现、迭代它们或重新加载服务。

2. SPI示例

2.1 SPI接口

package org.javacore.spi;
public interface DataStorage {
    String search(String key);
}

2.2 SPI实现类

package org.javacore.spi;
public class MysqlStorage implements DataStorage {
    @Override
    public String search(String key) {
        return "【Mysql】搜索" + key + ",结果:No";
    }
}
package org.javacore.spi;
public class RedisStorage implements DataStorage {
    @Override
    public String search(String key) {
        return "【Redis】搜索" + key + ",结果:Yes";
    }
}

2.3 SPI配置

如果想通过 Java SPI 机制来发现服务,就需要在 SPI 配置中约定好发现服务的逻辑。配置文件必须置于 META-INF/services 目录中,并且,文件名应与服务提供者接口的完全限定名保持一致。文件中的每一行都有一个实现服务类的详细信息,同样是服务提供者类的完全限定名称。以本示例代码为例,其文件名应该为org.javacore.spi.DataStorage,

文件内容如下:

org.javacore.spi.MysqlStorage
org.javacore.spi.RedisStorage

2.4 调用

import java.util.ServiceLoader;

public class SpiDemo {
    public static void main(String[] args) {
        ServiceLoader<DataStorage> serviceLoader = ServiceLoader.load(DataStorage.class);
        System.out.println("============ Java SPI 测试============");
        serviceLoader.forEach(loader -> System.out.println(loader.search("Yes Or No")));
    }
}

输出:

============ Java SPI 测试============
【Mysql】搜索Yes Or No,结果:No
【Redis】搜索Yes Or No,结果:Yes

3. SPI原理

Java SPI 机制依赖于 ServiceLoader 类去解析、加载服务。
即通过 ClassLoader 加载 SPI 配置文件,解析 SPI 服务,然后通过反射,实例化 SPI 服务实例。

4. SPI的不足

  • 不能按需加载,需要遍历所有的实现,并实例化,然后在循环中才能找到我们需要的实现。如果不想用某些实现类,或者某些类实例化很耗时,它也被载入并实例化了,这就造成了浪费。

  • 获取某个实现类的方式不够灵活,只能通过 Iterator 形式获取,不能根据某个参数来获取对应的实现类。

  • 多个并发多线程使用 ServiceLoader 类的实例是不安全的。

5. SPI的应用场景

  • DateFormatProvider: 为指定的语言环境提供日期和时间格式。
  • Driver: 从 4.0 版开始,JDBC API 支持 SPI 模式。旧版本使用 Class.forName() 方法加载驱动程序。
  • common-logging: 日志门面接口

标签:Java,String,实现,技术,接口,SPI,public
From: https://www.cnblogs.com/tonyq/p/17608462.html

相关文章

  • 微信开发之自动回复的技术实现
    请求URL:http://域名地址/sendText请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:login接口返回参数:参数名必选类型说明wId是string登录实例标识wcId是string接收人微信id/群idcontent是string文本内容消息返回数据:参数名类型说明codestring1000成功,1001失败m......
  • 微信开发之自动发送朋友圈的技术实现
    请求URL:http://域名地址/snsSend请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:login接口返回 参数:参数名必选类型说明wId是String登录实例标识content是String文本内容groupUser否String对谁可见(传微信id,多个用,分隔)blackList否String对谁不可见(传微信id,......
  • 赋能智慧医疗:构建高效电子处方小程序的技术要点
    时下,医疗行业也开始积极融合信息技术,将智慧医疗带入现实。其中,电子处方作为智慧医疗的重要组成部分,为传统的纸质处方带来了革命性的改变。电子处方小程序的出现使医生和患者能够更加高效地管理和获取处方信息,本文将就如何构建高效电子处方小程序进行探讨。一、数据安全的重要性在构......
  • 深入探讨代理技术:从Socks5、SK5到IP代理
    代理技术简介代理技术是一种允许用户间接访问网络资源的中间人。用户通过代理服务器与目标服务器进行通信,目标服务器只能看到代理服务器的IP地址,而无法获知真正请求的客户端。代理技术在隐私保护、访问控制和负载均衡等方面发挥着重要作用。Socks5代理Socks5代理是一种网络传输协......
  • ASPICE标准
    ASPICE(AutomotiveSoftwareProcessImprovementandCapabilityDetermination)是一种针对汽车软件开发过程的标准,旨在提高软件开发质量、安全性和效率。以下是ASPICE标准的详细说明:概述:ASPICE标准定义了一个层次结构,包括五个级别,从最低的Level0到最高的Level5。每个级别都有......
  • 微信开发之自动同意入群邀请的技术实现
    简要描述:自动通过群(url)请求URL:http://域名地址/acceptUrl请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:Authorization值(登录获取二维码信息接口中返回的认证信息值)参数:参数名必选类型说明wId是string登录实例标识url是str......
  • 介绍Sping Boot的5个扩展点
    1、初始化器ApplicationContextInitializer我们在启动SpringBoot项目的时候,是执行这样一个方法来启动的我们一层一层往下点,最终发现执行的是这个方法所以我们在启动项目的时候也可以这样启动newSpringApplication(SpringbootExtensionPointApplication.class).run(args);老的只......
  • 微信开发之自动同意群邀请的技术实现
    简要描述:自动通过群(url)请求URL:http://域名地址/acceptUrl请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:Authorization值(登录获取信息接口中返回的认证信息值)参数:参数名必选类型说明wId是string登录实例标识url是string原始url,好友发送的入群邀请卡片信息链......
  • STM32F030C8T6 SPI 通讯问题排查分析
    配置及问题列举1.STM32F030C8T6:48M系统时钟配置;2.SPI1:驱动LCD,半工主机通讯,极性为高、边沿为2,时钟分频系数16分频;3.SPI2:驱动TDC-GP21,全工主机通讯,极性为低、边沿为2,时钟分频系数4分频;1.LCD驱动为上升沿,改为{极性为低、边沿为1},初始化却无效;2.TDC-GP21驱动为下降沿,读取I......
  • msm8909_wk2124_SPI转串口485
    项目使用的是高通的msm8909平台,采用广和通SC806开发板,开发环境采用Ubuntu18.04。SC806默认有两路串口,对项目来说不够使用,需要进行转接,所以采用了wk2124将一路SPI转换为4路串口,然后再加485芯片,转换为4路485接口。接下来详细看看整个配置过程。概述说明:本文档会将为开提供的官方文......