SPI机制详解

在上一篇 gRPC源码剖析-Server启动流程 有提到过SPI机制,SPI对于大多数业务开发人员可能并不熟悉,但是在各底层基础框架中用得还是比较多的,今天我们来详细了解一下。

一、SPI机制

SPI,全称是Service Provider Interface,就是为某个接口寻找服务实现的机制。

SPI机制遵循约定

1、服务提供方提供接口具体实现,并且必须在Jar包的META-INF/services目录下创建以“接口全名”为文件名,内容为实现类全类名。

2、主程序通过ServiceLoader动态加载实现类,需要扫描META-INF/services目录下配置文件找到实现类然后反射加载到JVM。

二、ServiceLoader

ServiceLoader和ClassLoader差不多也是用来加载类文件,但和ClassLoader有一些区别

1、ServiceLoader加载的是有共同接口的实现类,ClassLoader是个万能类加载器。

2、ServiceLoader加载类时依赖于META-INF/services的配置。

3、ServiceLoader实现了Interator接口,方便遍历出接口对应所有的实现类。

4、ServiceLoader类内部引用了ClassLoader进行类加载。

重要方法:ServiceLoader<S> load(Class<S> service),为给定的接口创建类加载器并通过反射加载具体的实现类。

三、一个打印例子

创建一个Maven多模块应用

1、api模块: 接口定义

2、yunda模块:韵达打印面单实现

配置文件

路径:/resources/META-INF/

service/org.api.PrintService

内容:org.yunda.YundaPrintServiceImpl

3、zto模块:中通打印实现

配置文件

路径:/resources/META-INF/

service/org.api.PrintService

内容:org.yunda.ZtoPrintServiceImpl

4、test模块:测试

必须引入 zto包依赖或yunda包依赖,否则虽然编译时不会报错,但运行时加载不到类的实现,这里折腾了很久。

四、JDBC使用SPI分析

1、驱动

mysql-connector-java.jar

META-INF/service/java.sql.Driver内容com.mysql.cj.jdbc.Driver

ojdbc.jar

META-INF/service/java.sql.Driver内容oracle.jdbc.OracleDriver

2、DriverManager

DriverManager是JDBC里管理不同数据库驱动的工具,核心与SPI有关的代码如下

根据注入的jdbc.drivers加载对应的数据库驱动。

注:SPI在底层框架使用的还是极其广泛的,除上上面讲到的JDBC数据库驱动,还有Spring、Dubbo、gRPC甚至淘宝交易平台早期也是用SPI来做业务隔离。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/573975.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析MD5哈希算法:原理、应用与安全性

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 本文将深入探讨MD5哈希算法的工作原理、应用场景以及安全性问题。我们将了解MD5如何生成固定长度的哈希值&#xff0c;以及它在数…

高效提升电池寿命和安全性 | 基于ACM32 MCU的BMS应用方案

BMS电池管理概述 BMS&#xff0c;即电池管理系统&#xff08;Battery Management System&#xff09;&#xff0c;随着锂电池的广泛应用&#xff0c;BMS作为锂电池的“保姆”也越来越被大众所关注。相较于传统电池&#xff0c;锂电池具有更好的能力密度&#xff0c;更高的工作电…

慧天[HTWATER]:采用CUDA框架实现耦合模型并行求解

慧天[HTWATER]软件简介 针对城市排水系统基础设施数据管理的需求&#xff0c;以及水文、水力及水质模拟对数据的需求&#xff0c;实现了以数据库方式对相应数据的存储。可以对分流制排水系统及合流制排水系统进行地表水文、管网水力、水质过程的模拟计算。可以对城市低影响开发…

操作系统基础知识

进程最小的资源单位 1、理解 假如有两个程序A和B.程序A执行到一半的过程中,需要读取大量的数据输入(I/0操作),而此时CPU只能静静地等待读取读取完数据才能继续执行、这样就白白浪费了CPU资源。是不是在程序A读取的过程中,让程序B去执行,当程序A读取完数据之后,让程序B…

Nagios工具

一 nagios 相关概念 Nagios 是一款开源的免费网络监视工具&#xff0c;能有效监控 Windows、Linux 和 Unix 的主机状态&#xff0c;交换机路由器等网络设置&#xff0c;打印机等。在系统或服务状态异常时发出邮件或短信报警第 一时间通知网站运维人员&#xff0c;在状态恢复后…

使用 Vercel 快速搭建 ChatGPT(免费)

前言 在开始前&#xff0c;你需要了解这些知识 在中国大陆境内域名提供商购买的域名&#xff0c;需要实名认证才能开启 DNS 解析。而在国外域名提供商买的域名则不用。 指向中国大陆内的云服务器的域名提供的网站&#xff0c;必须备案才能正常被访问。但是任何指向国外服务器…

专业文件翻译,笔译翻译公司推荐!

在全球化的大潮中&#xff0c;文件翻译已然成为了商业、法律、科技、文化等诸多领域的核心纽带。特别是在商业交往、合同签订、技术交流等方面&#xff0c;一份高质量的译文往往关乎着合作的成败。而在这其中&#xff0c;专业的文件翻译公司更是扮演着至关重要的角色。它们不仅…

What‘s new in PikiwiDB(Pika) v3.5.3(正式版)

随着 Redis 宣布采用双协议以维护其商业利益&#xff0c;PikiwiDB(Pika) 社区非常荣幸地宣布之际&#xff0c;我们的最新 v3.5.3 正式生产可用版本现已发布。 v3.5.3 版本不仅修复了长期存在的 Bug&#xff0c;还引入了一系列新特性。这些新特性包括 Pika 对 ACL 的支持、移除…

关于多线程Future和CompletableFuture区别

Future类的作用&#xff1a; Future它是基于异步思想的&#xff0c;举个例子&#xff0c;就是我有一个耗时的任务&#xff0c;提交给我Future来处理&#xff0c;任务执行期间&#xff0c;我自己可以去做任何事情&#xff0c;并且在这个期间我还可以取消任务以及获取任务的执行…

利用CANopen转Profinet网关实现与汇川变频器的连接与参数修改

在工业自动化领域&#xff0c;配置一个稳定、高效的通信系统是至关重要的。本文将详细介绍如何使用开疆智能canopen转profinet网关来配置一个包含变频器的主从站通信系统。我们需要在软件中新建一个工程&#xff0c;并添加canopen转profinet网关主站设备。这通常是整个配置过程…

Github获取ssh key的办法

目录 目录 前言 1、获取密钥指令 2、查看密钥 3、在vs中向GitHub推送代码 4、重新向GitHub推送修改过的代码 前言 不管是git bash还是xshell&#xff0c;还是其它软件获取ssh key的方式都一样&#xff0c;只不过查看的位置不同 1、获取密钥指令 指令&#xff1a;ssh-…

红队笔记8-CTF5打靶流程-CMS漏洞-多用户信息泄露(vulnhub)

目录 开头: 1.主机发现和端口扫描&#xff1a; 2.80端口-NanoCMS哈希密码信息泄露-后台getshell 3.提权-用户过多信息泄露 4.总结&#xff1a; 开头: 学习的视频是哔哩哔哩红队笔记&#xff1a; 「红队笔记」靶机精讲&#xff1a;LAMPSecurityCTF5 - 标准攻击链&#xff…