首页 > 编程语言 >Java的SPI机制实践

Java的SPI机制实践

时间:2023-07-18 22:56:13浏览次数:43  
标签:文件 Java 实现 实践 SPI java 机制

Java SPI机制概述

先给出结论:“Java的SPI是一种服务发现机制,用于约定接口和动态发现实现类,体现了分层解耦的思想”。
Java的SPI机制常用于框架扩展或组件替换,最常见的Java SPI应用就是JDBC Driver,JDK提供了java.sql.Driver接口,却将具体的实现交给了相应的数据库驱动,比如:在mysql-connector-java-6.0.6.jar文件中可以看到一个遵循Java SPI机制的文件META-INF/services/java.sql.Driver,并且在该文件中定义了具体的驱动实现类完整限定名称:com.mysql.cj.jdbc.Driver
MySQL驱动SPI机制

驱动实现类com.mysql.cj.jdbc.Driver实现了JDK提供的java.sql.Driver接口。
MySQL驱动实现类

关于Java原生SPI机制的说明详见:Introduction to the Service Provider Interfaces

如何实践Java SPI机制

应用Java SPI机制分为四步:

第一步: 约定接口。

package org.chench.extra.java.spi;
public interface HelloSPI {
    void sayHello();
}

第二步: 编写接口实现类。

package org.chench.extra.java.spi;
public class ImageHello implements HelloSPI {
    @Override
    public void sayHello() {
        System.out.println("Image Hello");
    }
}

第三步: 在实现类所在的jar包路径META-INF/services下创建一个以“接口完整限定名”命名的描述文件,文件内容为“实现类的完整限定名”(可以是包含多行,每一行是一个实现类的完整限定名)。
如:创建文件META-INF/services/org.chench.extra.java.spi.HelloSPI,内容为:org.chench.extra.java.spi.ImageHello
SPI描述文件

第四步: 使用Java SPI机制动态加载实现类。

public class SPISample {
    public static void main(String[] args) {
        // Java SPI机制使用ServiceLoader动态加载实现类
        ServiceLoader<HelloSPI> loader = ServiceLoader.load(HelloSPI.class);
        Iterator<HelloSPI> iterator = loader.iterator();
        while (iterator.hasNext()) {
            iterator.next().sayHello();
        }
    }
}

输出:

Image Hello

如上所示,在Java SPI机制的应用中接口实现类是完全分开的(在不用的jar文件中),所以需要在实现类所在的jar文件中包含一个描述文件。

通常来讲,Java的SPI机制常用于框架中实现功能扩展或替换,即:接口定义和使用ServiceLoader动态加载实现类是在框架代码中,而接口实现类以及描述文件是在扩展代码中,它们分布在不同的jar文件。
实际上,在分布式服务框架Dubbo中也提供了类似于Java原生SPI的扩展机制,详见:自定义扩展

Java原生SPI机制的不足

ServiceLoader类的应用及实现来看,存在一些缺点和不足:

  1. 原生的Java SPI机制只能通过迭代器访问实现类,这样会加载所有在描述文件中的实现类,无法按需加载将造成内存资源浪费。
  2. 多个并发线程使用ServiceLoader示例时不是线程安全的。

为了弥补Java原生SPI机制的不足,Dubbo框架提供了自己的SPI扩展机制,具体使用详见:自定义扩展

【参考】
深入理解 Java 中 SPI 机制
搞懂dubbo的SPI扩展机制
Dubbo 扩展设计理念

标签:文件,Java,实现,实践,SPI,java,机制
From: https://www.cnblogs.com/nuccch/p/17564353.html

相关文章

  • Java高并发编程的关键概念和技术,深入理解并成功应对高并发问题
    Java高并发编程的关键概念和技术,深入理解并成功应对高并发问题1.是什么是高并发?高并发指的是系统在同一时间点需要处理大量并发请求的能力。这些请求可能来自多个用户或者多个线程。在高并发环境下,传统的串行处理方式往往无法满足性能需求,因此需要采用并发编程来提高系统的吞吐......
  • 六月学习之Haproxy ACL实践(基于路径调度)
    2、ACL场景实践2.3、ACL案例-基于路径调度#根据用户请求的URL。调度到不同的后端集群用户通过/static调度到172.16.1.7:80用户请求/user调度到172.16.1.8:802.3.1、配置后端节点#web1:/static站点定义cat/etc/nginx/conf.d/www.qingchen.com.confserver{listen80;......
  • Java中的split( )函数
      Java中的split()函数Leaf_Ysm关注IP属地:浙江0.1512018.10.2410:44:46字数252阅读46,821首先,我们来了解一下split()函数各个参数的意义publicString[]split(Stringregex,intlimit)regex--正则表达式分隔符。limit--分割的份数。下面就让我......
  • [Javascript] DOM alias $, $$
    const$=()=>document.querySelector.call(this,arguments);const$$=()=>document.querySelectorAll.call(this,arguments);HTMLElement.prototype.on=(a,b,c)=>this.addEventListener(a,b,c);HTMLElement.prototype.off=(a,b)=>this.......
  • Sealos Web UI 公有云部署实践
    不管部署任何开源的产品,首先看他的官网文档或者github的readme、wiki等等这是 sealosgithub readmehttps://github.com/labring/sealos/blob/main/deploy/cloud/README.md  一、准备一台服务器你可以使用自己本地电脑安装vmware创建一台虚拟机,操作系统Ubuntu我这里......
  • java mongo 插入geometry 多边形 线 点
    importcom.mongodb.client.MongoCollection;importcom.mongodb.client.model.geojson.LineString;importcom.mongodb.client.model.geojson.Point;importcom.mongodb.client.model.geojson.Polygon;importcom.mongodb.client.model.geojson.Position;importcom.tusvn.cc......
  • Java读取txt文件内容并求交集并集差集对称差集合去重
    Java读取两个txt内容并作集合运算文件内容及格式完整代码packagecom.example.fortotest;importjava.io.BufferedReader;importjava.io.File;importjava.io.InputStreamReader;importjava.nio.file.Files;importjava.util.HashSet;importjava.util.Objects;pu......
  • Java异常机制
    Java异常机制什么是异常异常是指程序运行中出现的不期而至的各种状况,例如:文件找不到,网络连接失败,非法参数等异常的三种类型:检查型异常:最具代表的是用户错误或问题引起的异常运行时异常错误:错误不是异常,而是脱离程序员控制的问题异常体系结构Java把异常当作对象......
  • Java常用类
    Java常用类内部类概念:在一个类的内部再定义一个完整的类特点:1.编译后可以生成独立的字节码文件​ 2.内部类可以直接访问外部类的私有成员,而不破坏封装​ 3.可为外部类提供必要的功能组件//身体publicclassBody{privateStringname;//头部clas......
  • JAVA SE基础《七》 ---- JAVA案例
    目录一、案例一:买飞机票二、案例二:开发验证码三:案例三:评委打分四、案例四:数字加密五、案例五:数组拷贝六、案例六:抢红包七、案例七:找素数八、案例八:打印乘法表,打印三角形九、案例九:模拟双色球[拓展案例]1、业务分析、随机生成一组中奖号码2、让用户输入一组号码......