SPI和类加载器

类加载器以及SPI 目录:            申明            JVM类加载以及SPI 类的生命周期: 1.加载 2.验证 类加载器以及双亲委派模型 SPI (service provider interface) 3.准备 4.解析 5.初始化阶段 申明 本文很多的内容都是作者通过阅读《深入理解Java虚拟机[JVM高级特性与最佳实践](周志明)》这本书学习到的。如果需要关于类... 阅读详情

主要目的

SPI的本质是java的一种服务发现能力。
如果同时面临下面两个问题,就可以使用SPI
**0)AB模块使用不同的类加载器,且A模块的加载器无法加载B模块
1)A模块依赖B模块。
2)A模块又要先于B模块被类加载,或者不能确定两个模块的类加载顺序。

大部分场景其实根本不需要SPI。合理的类依赖可以避免这个问题。
SPI的本质思路很简单,就是使用线程上下文加载器去加载用到的类。SPI不是JVM提供的能力,而是JDK中提供的tricky但必要的能力。

一个简单的demo

具体的例子见
https://blog.youkuaiyun.com/qq_27292113/article/details/100324127

核心代码如下

  • 在核心jar中定义接口,并使用接口代码
  • 在外部jar中定义services
    在这里插入图片描述
  • 使用是是会选择第一个实现
    在这里插入图片描述
    通过ServiceLoader完成加载

类加载机制

实际应用

JAVA日志

启动时,我们可以看见,slf4j找到了多个SPI的实现。

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/gdl/.m2/repository/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/gdl/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.10.0/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
SpringBoot
JDBC

java.sql.DriverManager类会在其static代码段执行

                ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
                Iterator<Driver> driversIterator = loadedDrivers.iterator();

                /* Load these drivers, so that they can be instantiated.
                 * It may be the case that the driver class may not be there
                 * i.e. there may be a packaged driver with the service class
                 * as implementation of java.sql.Driver but the actual class
                 * may be missing. In that case a java.util.ServiceConfigurationError
                 * will be thrown at runtime by the VM trying to locate
                 * and load the service.
                 *
                 * Adding a try catch block to catch those runtime errors
                 * if driver not available in classpath but it's
                 * packaged as service and that service is there in classpath.
                 */
                try{
                    while(driversIterator.hasNext()) {
                        driversIterator.next();
                    }
                } catch(Throwable t) {
                // Do nothing
                }
                return null;

注释上写的很清楚
DriverManager类会被Bootstrap类加载器加载。但是这个时候,他是在核心库中找不到具体实现模块的。所以,他必须先去寻找自己需要加载的模块,再完成本类的加载。

driver接口定义了如下方法
在这里插入图片描述
可以看到有诸多的实现。
在这里插入图片描述
简单而言,就是自动加载:DriverManager的静态代码块执行的时刻,使用该时刻当前线程类加载器加载java.sql.Driver文件,并用当前线程类加载器加载及、实例化、registerDriver

边表法 边表法是用来绘制填充一个面的,边表法的关键是边表和连接边表的扫描线。 对于边的描述利用边表数据结构,包含边与扫描线的交点x坐标,边的最大y坐标,这样可以知道边加入到哪些扫描线上,便还有一个指针来记录扫描线上其它边。 //边数据结构 #pragma once #ifndef __CAETZ__ #define __CAETZ__ #include "pch.h" #include "CPoin... 阅读详情

相关推荐

KTransformers安装笔记 利用docker安装KTransformers

KTransformers安装笔记 利用docker安装KTransformers

guoqingru0311的博客 1559

Java:类加载机制与与spi的联系

Java类加载机制和spi

qjyws的博客 1132

Burp Suite手工验证CORS漏洞的四步闭环法

CORS(跨域资源共享)是Web应用实现跨域通信的基础机制,其安全本质在于服务端对Origin头的校验逻辑与响应头组合的语义一致性。当服务端错误地返回Access-Control-Allow-Origin: *并配合Access-Control-Allow-Credentials: true,或采用弱校验(如字符串包含匹配)时,将导致敏感数据泄露与凭据劫持风险。该漏洞难以被自动化扫描器发现,因其依赖请求上下文、认证状态及动态策略判断。Burp Suite作为核心工具,需通过构造跨域请求、捕获预检响应、交叉验

weixin_30596343的博客 512

源码级深度理解 Java SPI

本文从源码入手分析,深入探讨 Java SPI 的特性、原理,以及在一些比较经典领域的应用。

vivo互联网技术 709

Oracle Primavera P6实战手册:从入门到精通的企业项目管理秘籍

本文详细介绍了Oracle Primavera P6在企业项目管理中的实战应用,从环境配置到高级进度控制技巧,帮助用户从入门到精通。通过WBS设计、资源优化和情景模拟等核心功能,提升项目管理效率。特别适合需要处理复杂项目和多团队协作的企业用户。

weixin_29235923的博客 252

嵌入式铁头山羊stm32-GPIO的四种输入模式-Day5

本文详细解析了GPIO的输入结构和工作原理,包括上拉/下拉模式、悬空设计、保护二极管机制等关键内容。重点阐述了不同输入模式下电流流向与电压变化,解释了上拉/下拉电阻、施密特触发器、保护二极管等元件的作用。特别对保护二极管的工作机制进行深入分析,说明其在过压/欠压时的钳位保护功能。同时解答了关于电压差、电流方向、负电压等常见疑问,并强调GPIO设计的灵活性(可配置上拉/下拉/悬空)是为了适应不同外设需求。全文通过电路分析和生活类比,帮助读者理解GPIO输入电路的工作原理和设计考量。

古泽汉书的博客 1966

轻松搞懂Java类加载与SPI机制

你知道Java的类加载机制吗?你了解双亲委派模型吗?你知道怎么打破双亲委派模型吗?这些都是面试经常出现的问题,今天我带大家从类加载机制出发,帮助大家快速掌握Java的SPI机制与Spring的SPI机制。

mathGaosi的博客 706

Lora无线温湿度传感器方案

综上所述,Lora无线温湿度传感器以其长距离传输、低功耗、高稳定性、精准测量、无线传输以及广泛的应用场景等特点,在环境监测领域展现出了强大的竞争力和广泛的应用前景。Lora无线温湿度传感器广泛应用于各种需要远程监控和数据采集的场景,如仓储、农业、机房、楼宇、交通、工业、矿产、电力等领域。Lora无线温湿度传感器是一种采用Lora无线通信技术进行数据传输的温湿度监测设备。四、产品参数(以某款工业级Lora温湿度传感器为例)

weixin_46632654的博客 757

2.SpringBoot框架启动流程之Spi机制

ConfigurationClassParser内部类DeferredImportSelectorHandler & DeferredImportSelectorGroupingHandler。

qq_36851469的博客 1198

CTFHUB------XSS反射型(WP)

文章目录前言XSS测试平台 前言 一开始我直接在上面写js脚本发现出错,最后发现只能通过下面的输入框来执行XSS测试,于是我们只能用XSS测试平台解决问题 XSS测试平台 注册一个XSS测试平台 这里随便填写 勾选默认模块就够了,点击下一步 这时会出现一个找个将代码复制 拼接到网站后缀name后面,点击send 这时平台会收到一个记录点开即可 得到flag ...

Y4tacker的博客 1万+

深入剖析 Hive 中 CASE WHEN 与 IF 函数的性能差异:解锁高效数据处理的关键

CASE WHEN 函数堪称 Hive 中条件判断的多面手,它具备两种强大的语法形式,以应对各种复杂的业务逻辑。简单 CASE 表达式这种形式适用于对某一列的值进行直接的条件匹配。其语法如下:END例如,我们有一个记录学生成绩的表CASE scoreELSE 'D'搜索 CASE 表达式当业务逻辑需要更灵活的条件判断时,搜索 CASE 表达式便派上用场。它的语法为:CASEENDCASEELSE 'D'

2401_83088008的博客 1125

类加载器、双亲委派、SPI机制

JVM 并不是在启动时就把所有的​​.class​​​文件都加载一遍,而是程序在运行过程中用到了这个类才去加载。除了启动类加载器外,其他所有类加载器都需要继承抽象类​​ClassLoader​​,这个抽象类中定义了三个关键方法,理解清楚它们的作用和关系非常重要。//每个类加载器都有个父加载器//查找一下这个类是不是已经加载过了Class<?//如果没有加载过//先委派给父加载器去加载,注意这是个递归调用if (parent!

helloworld_9的博客 1047

IP-Guard安全网关实例

企业相关情况: 1.OA系统,主要为日常工作使用,该系统IP为192.168.1.2,端口为8080; 2.文件共享服务器,用于存放日常工作资料和文档,该文件共享服务器的IP为192.168.1.1,其中\\192.168.1.1\private 目录中的存放着公司重要文档,不能随意外传; 3.安全网关已采用串联的方式联入网络,IP为192.168.2.6,所有机器访问OA系统和文件共享服务...

IP-Guard专栏 706

Java线程上下文类加载器与SPI

线程上下文类加载器(context class loader)是从JDK 1.2开始引入的。类 java.lang.Thread中的方法getContextClassLoader()和setContextClassLoader(ClassLoader cl)用来获取和设置线程的上下文类加载器。如果没有通过 setContextClassLoader(ClassLoader cl)方法进行设置的话,

长青树呀 4422

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SPI原理-线程上下文类加载器

最近在看spring源码时,发现了一个方法ClassUtils.getDefaultClassLoader(),先看一下源码 public static ClassLoader getDefaultClassLoader(){ ClassLoader cl = null; try { cl = Thread.currentThread().getContextClassLoader(); }catch (Throwa...

远方的少年 1026

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SPI与线程上下文类加载器

所属文集:ClassLoader串烧 前提 传送门 :理解当前类加载器,主动加载,自动加载是什么! 需求 程序运行过程中要用到的类,通过当前类加载器的自动加载,加载不到(不在当前类加载器的类资源管辖范围),如果要使用这个类,必须指定一个能够加载这个类的加载器去加载,而怎么获取这个加载器是个问题。 程序都是在线程中执行,那么从线程的上下文中去拿最合理,所以就诞生了线程上下文类加载器,这个加载器的是非自动加载,即通过forName 或者 loadClass的方式去加载类。 两种场景 1.当高层提供

zzy7075的专栏 696

【jvm jdk】类加载器4 线程上下文类加载器 & DriverManager& Driver& mysql驱动详解(SPI)

文章目录1. 简介2. 用法3. 上下文类加载器的作用 1. 简介 线程上下文类加载器(context class loader)是从 JDK 1.2 开始引入的。类 java.lang.Thread中的方法 getContextClassLoader()和 setContextClassLoader(ClassLoader cl)用来获取和设置线程的上下文类加载器。如果没有通过 setContextClassLoader(ClassLoader cl)方法进行设置的话,线程将继承其父线程的上下文类加载器。

m0_45406092的博客 937

Java中的类加载器、双亲委派、SPI机制

平时做业务开发比较少接触类加载器,但是如果想深入学习Tomcat、Spring等开源项目,或者从事底层架构的开发,了解甚至熟悉类加载的原理是必不可少的。Java的类加载器有哪些?什么是双亲委派?为什么要双亲委派?如何打破它?多多少少对这些概念了解一些,甚至因为应付面试背过这些知识点,但是再深入一些细节,却知之甚少。JVM 并不是在启动时就把所有的​​.class​​​文件都加载一遍,而是程序在运行过程中用到了这个类才去加载。

qq_45867699的博客 798

线程上下文类加载器和SPI问题

1、SPI(Service privider interface)服务提供者接口;比如连接数据库的JDBC;Driver、Connect都是接口,具体的实现是由各个厂商完成的。 这样会出现一个问题,java.sql.Driver在核心库中,由 启动类加载器加载;而具体实现jar包放在classpth下,由系统加载器AppClassLoader加载,根据双亲委托机制,启动类加载器加载的类无法调用系统...

qq_20846769的博客 1019

java类加载器以及spi

类加载器概述: 每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程称为类加载。   那么 .class 文件什么时...

奋斗不息 3302

java 类加载器,SPI机制,spring factories的原理

java的SPI机制打破双亲委派进行加载类。 约定条件如下: 1、当一个服务提供者提供了一个接口的具体实现后,在该服务打的jar包里的META-INFO/services目录下创建一个以接口全限名为命令的文件,文件里的内容为接口的实现类。 2、将这个jar包放入到主程序的classPath中。 ...

只有不断地学习,不断地进步,才能感受到生活的快乐,意义。。。。 1797

Java中的SPI机制与上下文类加载器

SPI机制是Java中一种实现动态扩展的机制,它通过类和特定的目录结构来实现。应用程序可以定义一个接口,然后通过SPI机制注册和加载具体的服务提供者实现。SPI机制允许应用程序在不修改源代码的情况下,通过添加新的服务提供者实现来扩展功能。

FFFSSSFFF6的博客 640

jvm 类加载机制 之线程上下文类加载器在spi 中的应用 (4)

线程上下文类加载器(context class loader)是从JDK 1.2开始引入的。 类 java.lang.Thread中的方法getContextClassLoader()和setContextClassLoader(ClassLoader cl)用来获取和设置线程的上下文类加载器。如果没有通过 setContextClassLoader(ClassLoader cl)方法进行设置的...

xiaoliuliu2050的专栏 1139

【JVM】类加载器、双亲委派、SPI(二)

元空间内部给各个类加载器划分了内存区域。另外还需要注意一点的是,方法区会有碎片化问题,方法区的垃圾回收通常被称为类的卸载。方法区回收之后是没有整理的。

Cover_sky的博客 1363

JVM类加载器子系统与SPI

类加载器子系统与SPI类加载器启动类加载器扩展类加载器应用类加载器类加载器加载的类如何存储双亲委派打破双亲委派SPI机制 类加载器 JVM中有两种类型的加载器,一种是由C++编写,一种是由JAVA编写,除了启动类加载器(Bootstrap Class Loader)是由C++编写的以外,其他都是由JAVA编写的,由JAVA编写的加载器都继承与java.lang.ClassLoader,JVM还支持自定义加载器,对于自定义加载器的典型用法就是可以破坏JVM的双亲委派,为什么要破坏双亲委派,想要做到破坏双亲委派

JAVA技术爱好者 718

采用JDBC解释java SPI机制和线程上下文类加载器 —————— 开开开山怪

采用JDBC解释java SPI机制和线程上下文类加载器 先说说SPI(Service Provider Interface),大部分解释是这样的,我简单总结一下就是这样,SPI机制可以做到将服务接口和和真正的服务接口的实现类分开,可以增加程序的可扩展性,通过扫描规定的路径来进行实现类的获取,可以说是一种服务发现机制。 好处就在于,在面向对象的设计中,我们一般建议基于接口的编程,如果代码中涉及到...

String_guai 600

jdbc 类加载器,与 spi 服务机制

这几天在看java 类加载机制,看到 spi 服务机制破坏了双亲委派模型,特地研究了下典型的 spi 服务 jdbc 驱动 首先运行一下代码,查看 mysql jdbc 驱动的类加载(maven 项目已经引进 jdbc 驱动依赖,版本为5.1.41)public static void main(String[] args) { Enumeration<Driver> dr

玩家六的专栏 3552
上一篇: redis集群的相关问题
下一篇: JUC实战之利用JUC解决问题
define_us
博客等级 码龄14年 157粉丝 531原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值