【JVM】Java中SPI机制

打破双亲委派模型中提到SPI和JDBC相关内容,那么是如何打破双亲委派模型呢?本文进行一个讲解,在开始讲解之前,我们需要先了解Java中的SPI机制

是什么

SPI 全称Service Provider Interface,是 Java 提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。主要是被框架的开发人员使用,最经典的使用比如 java.sql.Driver 接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而 Java 的 SPI 机制可以为某个接口寻找服务实现。
Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是解耦。下面提供一张图 帮助大家理解:
在这里插入图片描述

如何理解

最经典的还是 java.sql.Driver 接口。
条件允许的话,可以打开idea,根据下面一起操作。查找 MySQL 依赖下 META-INF 包下 service 包下 java.sql.Driver 文件打开,发现此文件中只有com.mysql.cj.jdbc.Driver这一个路径。

在这里插入图片描述

双击 Shift 复制此路径,我们找到这个这个类并打开,效果如下:

在这里插入图片描述

到此为止,我们可以知道 JDK 会根据 java.sql.Driver 文件中的 com.mysql.cj.jdbc.Driver 实现类名去加载 MySQL 中的这个 Driver 实现类了。那么如何加载呢?这就要说到 JDK 中查找服务的实现的工具类了,这个工具类是 java.util.ServiceLoader

在这里插入图片描述

具体可以查看类详细注解。这里想说的是,这个 ServiceLoader 类中有一个load()方法,此方法是关键,正通过这个方法可以加载所有驱动。(到这里整个 SPI 机制已经完结,下面的介绍是进一步解释整个驱动如何被加载。)

在这里插入图片描述

其实这整个过程就像切菜一样。我们菜 (MySQL 驱动 Driver 准备完毕) 已经洗好了,刀具( ServiceLoader.load()方法 )也已经准备好了,那么我们少了一个持刀的人啊,那么究竟是谁拿这把刀去"切"菜呢?
我们学习 JDBC 的时候应该还记得几个重要概念,分别为 DriverManager,Connection,Statement,PreparedStatement 和 ResultSet。这几个类与接口关系图如下:

在这里插入图片描述
这几个核心 API 作用如下:

在这里插入图片描述
通过上述我们可以发现 DriverManager 的作用比较大,可以管理和注册数据库驱动以及能得到数据库连接对象。那么管理和注册是否就是那个操刀的人?我们点开 DriverManager 类来看,在此类中快捷键 Ctrl+F12,我们会发现,这个类中有许多方法以及一个静态类初始化器(也就是我们说的静态代码块),回想一下静态代码块有什么作用?什么时候加载?静态代码块中内容如下:

在这里插入图片描述

翻译过来就是通过检查系统属性 jdbc.properties 来加载初始 JDBC 驱动程序,然后使用 {@code ServiceLoader} 机制。到这里我们就全都明白了,初始化 DriverManager 类时,也会执行静态代码块中的内容,而静态代码块中的内容主要就是使用 ServiceLoader.load 方法去加载所有的驱动。到此为止,整个SPI机制以及如何加载驱动就已经完结,下一篇继续讲解加载驱动时到底是如何打破双亲委派机制

参考链接

https://zhuanlan.zhihu.com/p/84337883
https://blog.csdn.net/weixin_47267628/article/details/121735098
https://www.cnblogs.com/yougewe/p/12460685.html

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

python jupyter notebook打开页面方便使用

如果没安装jupyter, 请安装: pip install jupyter notebook 运行jupyter notebook jupyter notebook

“政务服务+AI交互数字人”,重新定义政务服务体验

随着AIGC发展,各地方政务部门纷纷通过AI交互数字人技术,提升企业和群众的办事效率、满意度,以数字人有效推动政务服务数字化、智能化发展。 *图片源于网络 如高新区将数字人海蓝作为政务服务大使,让数字人化身AI交互数字人可以面…

k8s-heml联动harbor 18

将打包的heml包上传到harbor仓库进行管理 创建一个公开的项目来接收传送的heml包 安装helm-push插件: helm plugin install https://github.com/chartmuseum/helm-push (在线安装,要求网速要快或者提供科学上网) 离线安装&…

Ansible 简介及部署 基础模块学习 ansible部署rsync 及时监控远程同步

Ansible介绍: Ansible 是一个配置管理系统,当下最流行的批量自动化运维工具之一,它是一款开源的自动化工具,基于Python开发的配置管理和应用部署的工具。 Ansible 是基于模块工作的,它只是提供了一种运行框架&#xff…

5G网络建设 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C 题目描述 现需要在某城市进行5G网络建设,已经选取N个地点设置5G基站,编号固定为1到N, 接下来需要各个基站之间使用光纤进行连接以确保基…

Stable Diffusion 绘画入门教程(webui)-ControlNet(IP2P)

上篇文章介绍了深度Depth,这篇文章介绍下IP2P(InstructP2P), 通俗理解就是图生图,给原有图加一些效果,比如下图,左边为原图,右边为增加了效果的图: 文章目录 一、选大模型二、写提示词三、基础参…

计算机网络:思科实验【1-访问WEB服务器】

🌈个人主页:godspeed_lucip 🔥 系列专栏:Cisco Packet Tracer实验 本文对应的实验报告源文件请关注微信公众号程序员刘同学,回复思科获取下载链接。 实验目的实验环境实验内容熟悉仿真软件访问WEB服务器 实验体会总结…

Python实战:xlsx文件的读写

Python实战:xlsx文件的读写 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 👈 希望得到您的订阅和支持~ &#…

中断系统(详解与使用)

讲解 简介 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。 假设一个人在家看电视,这时候突然门铃响了,这个人此时就要停止看电视去开门,然后关上门后继续回来…

PyTorch:transforms.Normalize()函数详解

PyTorch:transforms.Normalize()函数详解 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 👈 希望得到您的订阅和…

考研西电(833),考什么?计算机组成原理第一章要点

目录 1.1 计算机的发展历史(必须要了解的知识点)1.1.1 发展历史1.1.2 摩尔定律★★ 1.2 计算机的基本组成1.2.1 硬件系统1.2.2 软件系统1.2.3 指令集系结构1.2.4 高级语言程序的执行过程 1.3 计算机的层次概念1.3.1 计算机系统的层次结构1.3.2 计算机体系…

React18源码: reconcliler启动过程

Reconcliler启动过程 Reconcliler启动过程实际就是React的启动过程位于react-dom包&#xff0c;衔接reconciler运作流程中的输入步骤.在调用入口函数之前&#xff0c;reactElement(<App/>) 和 DOM对象 div#root 之间没有关联&#xff0c;用图片表示如下&#xff1a; 在启…

TiDB 社区智慧合集丨TiDB 相关 SQL 脚本大全

非常感谢各位 TiDBer 在之前 【TiDBer 唠嗑茶话会 48】非正式 TiDB 相关 SQL 脚本征集大赛&#xff01;( https://asktug.com/t/topic/996635 )里提供的各种常用脚本。 在这篇文章中&#xff0c;我们整理了社区同学提供的一系列 TiDB 相关 SQL 脚本&#xff0c;希望能为大家在…

C++基础知识(六:继承)

首先我们应该知道C的三大特性就是封装、继承和多态。 此篇文章将详细的讲解继承的作用和使用方法。 继承 一个类&#xff0c;继承另一个已有的类&#xff0c;创建的过程 父类(基类)派生出子类(派生类)的过程 继承提高了代码的复用性 【1】继承的格式 class 类名:父类名 {}; 【…

机器视觉选型:如何选择一个合适光源控制器

在机器视觉系统中&#xff0c;选择合适的光源及其控制器对于确保高质量图像捕获和处理至关重要。本文会提供一些建议&#xff0c;以便于引导您了解如何基于应用需求选择最合适的光源和光源控制器。 1. 理解光源的功率需求 不同类型的光源具有不同的功率需求&#xff0c;这直接…

汽水分离器——矿用分离过滤装置

去找一个奋发向上能带动你的人&#xff0c;去找一个像太阳一样的人&#xff0c;帮你晒晒全部不值一提的迷茫! 一、结构&#xff1a; 气水分离器又称气水分离过滤器&#xff0c;主要由&#xff1a;进口、筒体、滤芯连接件、滤芯、密封圈、阀门连接件、出气管、排水口、压力表等…

多人协作记账账本小程序开源版开发

多人协作记账账本小程序开源版开发 支持多人协作的记账本小程序&#xff0c;可用于家庭&#xff0c;团队&#xff0c;组织以及个人的日常收支情况记录&#xff0c;支持周月年度统计 便捷记账 便捷的记账方式&#xff0c;支持多种记账类型&#xff0c;快捷切换账本等 多账本 支…

JavaScript的内存管理与垃圾回收

前言 JavaScript提供了高效的内存管理机制&#xff0c;它的垃圾回收功能是自动的。在我们创建新对象、函数、原始类型和变量时&#xff0c;所有这些编程元素都会占用内存。那么JavaScript是如何管理这些元素并在它们不再使用时清理它们的呢&#xff1f; 在本节中&#xff0c;…

汽车大灯尾灯破裂修复用什么胶?

汽车大灯尾灯破裂可以使用硅酮玻璃胶或者环氧树脂胶进行修复。 硅酮玻璃胶的优点主要包括&#xff1a; 粘接力强&#xff1a;硅酮玻璃胶具有很强的粘接力&#xff0c;可以有效地将裂缝两侧的材料紧密粘合在一起。拉伸强度大&#xff1a;硅酮玻璃胶固化后形成的固体具有较高的…

VM-UNet: Vision Mamba UNet for Medical Image Segmentation

VM-UNet: 基于纯 Mamba 架构的医学图像分割模型 论文地址&#xff1a;https://arxiv.org/abs/2402.02491 项目地址&#xff1a;https://github.com/JCruan519/VM-UNet Abstract 在医学图像分割领域&#xff0c;基于CNN和基于Transformer的模型都得到了广泛的探索。然而&#…