JVM的双亲委派模型

引言

Java类加载机制中的双亲委派模型通过层层委托保证了核心类加载器与应用类加载器之间的职责分离和加载安全性,但其单向的委托关系也带来了一些局限性。尤其是在核心类库需要访问或实例化由应用类加载器加载的类时,双亲委派模型无法满足需求,导致系统类无法直接调用应用类中的实现。为解决这一问题,Java采用了线程上下文类加载器(Context ClassLoader)机制,打破了传统双亲委派的限制,使核心类库能够通过当前线程的上下文类加载器访问应用层的扩展类。典型应用如JDBC中的DriverManager通过服务提供者接口(SPI)机制,利用上下文类加载器动态加载数据库驱动,实现了灵活可扩展的设计。本文将围绕双亲委派模型的不足及其被打破的原因,深入探讨SPI机制及线程上下文类加载器的作用与实现原理。

1. 什么是双亲委派模型?

https://zhuanlan.zhihu.com/p/612318527https://zhuanlan.zhihu.com/p/612318527

2. 为什么要打破双亲委派模型?

检查类是否加载的委托过程是单向的,这个方式虽然从结构上说比较清晰,使各个ClassLoader的职责非常明确,但是同时会带来一个问题,即顶层的ClassLoader无法访问底层的ClassLoader所加载的类。

通常情况下,启动类加载器中的类为系统核心类,包括一些重要的系统接口,而在应用类加载器中,为应用类。按照这种模式,应用类访问系统类自然是没有问题,但是系统类访问应用类就会出现问题。比如在系统类中提供了一个接口,该接口需要在应用类中得以实现,该接口还绑定一个工厂方法,用于创建该接口的实例,而接口和工厂方法都在启动类加载器中。这时,就会出现该工厂方法无法创建由应用类加载器加载的应用实例的问题。

3. SPI是如何打破双亲委派机制的?

由于双亲委派模型的限制,父加载器无法访问由子加载器加载的类,所以核心类库无法直接访问这些SPI实现类。当核心类库需要调用SPI实现时,它会通过Thread.currentThread().getContextClassLoader()获取当前线程的上下文类加载器,从而可以访问到应用层的实现类。

DriverManager是JDBC里管理和注册不同数据库Driver的工具类。在使用Java JDBC进行数据库编程时,我们引入驱动包之后,直接使用Connection connection = DriverManager.getConnection(url,user,password);便可以成功获得数据库连接。

  • 启动类加载器加载DriverManager。
  • DriverManager.getConnection时,通过SPI机制加载jar包中的mysql驱动。
  • SPI中利用了线程上下文类加载器(应用程序类加载器)去加载类并创建对象。

4. SPI机制

  1. 需要先定义一个接口,作为扩展的标准。
  2. 在 classpath 目录下创建 META-INF/service 文件目录。
  3. 在这个目录下,创建以接口的全限定名命名的配置文件,文件内容是这个接口的实现类。
  4. 在应用程序里面,使用 ServiceLoad.load(),就可以根据接口名称找到 classpath 所有的扩展类。

感谢您的阅读!如果文章中有任何问题或不足之处,欢迎及时指出,您的反馈将帮助我不断改进与完善。期待与您共同探讨技术,共同进步!

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

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

相关文章

6.4.高并发设计

目录 一、高并发系统设计基础理论 CAP定理与高可用性权衡 • 一致性(C) vs 可用性(A)在电商、社交场景的取舍 • 分区容错性(P)的实践意义:异地多活与脑裂处理 性能指标与评估模型 • QPS、TP…

工程师转型算法工程师 深入浅出理解transformer-手搓板

编码器 以下部分引用台湾大学李宏毅教授的ppt 自己理解解释一遍(在youtobe 上可以搜索李宏毅即可) 首先先来看transformer的架构图 Embedding 我们先从Imput Embedding 跟 OutPutEmbedding 开始,让我们用 bert 模型来做一个解释 从huggingface上下载的bert-base…

软件工程学概述

一、软件危机 (一)软件危机的介绍 1. 基本思想与定义 软件危机(Software Crisis)是指在计算机软件的开发和维护过程中所遇到的一系列严重问题,这些问题既包括技术层面的挑战,也涉及管理层面的困境。其核心…

【ArcGIS Pro微课1000例】0068:Pro原来可以制作演示文稿(PPT)

文章目录 一、新建演示文稿二、插入页面1. 插入地图2. 插入空白文档3. 插入图像4. 插入视频三、播放与保存一、新建演示文稿 打开软件,新建一个地图文档,再点击【新建演示文稿】: 创建的演示文档会默认保存在目录中的演示文稿文件夹下。 然后可以对文档进行简单的设计,例如…

[吾爱出品][Windows] 产品销售管理系统2.0

[Windows] 产品销售管理系统 链接:https://pan.xunlei.com/s/VOPej1bHMRCHy2np9w3TBOyKA1?pwdgjy7# 使用方法:1、先设置一下图片保存路径 2、维护产品。客户等基础信息。例如:销售类型:一次性 销售编码:RCX。 3、销…

MySQL数据库高可用(MHA)详细方案与部署教程

一:MHA简介 核心功能 二:MHA工作原理 三:MHA组件 四:MHA 架构与工具 MHA架构 Manager关键工具 Node工具 五:工作原理与流程 1: 故障检测 2: 故障切换(Failover) 3 : 切换模式 六&a…

华为设备链路聚合实验:网络工程实战指南

链路聚合就像为网络搭建 “并行高速路”,既能扩容带宽,又能保障链路冗余,超实用! 一、实验拓扑速览 图中两台交换机 LSW1 和 LSW2,PC1、PC2 归属 VLAN 10,PC3 归属 VLAN 30。LSW1 与 LSW2 通过 GE0/0/1、…

数组和集合

数组和集合的区别: 1、数组是固定长度的数据结构,一旦创建长度就无法改变,集合是动态长度数据结构,可根据需求动态增加或减少元素。 2、数组包含基本数据类型和对象,而集合只能包含对象。 3、数组可以直接访问元素&…

WPF MVVM进阶系列教程(一、对话框)

🍠 WPF MVVM进阶系列教程 一、对话框 在前面的文章中,我们介绍了MVVM开发的一些基础知识。 对于日常开发来说,基本已经足够应付大部分场景。 从这里开始,介绍的都是在MVVM模式开发中,提升程序可维护性、灵活性、健壮…

【AI News | 20250507】每日AI进展

AI Repos 1、CFWorkerACME SSL证书助手是一个免费开源的平台,基于Cloudflare Worker运行,旨在自动化SSL证书的申请和下发,尤其适用于多服务器或内网环境。它通过自动化的CNAME和DNS操作完成域名验证,支持Let’s Encrypt、ZeroSSL…

5 分钟用满血 DeepSeek R1 搭建个人 AI 知识库(含本地部署)

最近很多朋友都在问:怎么本地部署 DeepSeek 搭建个人知识库。 老实说,如果你不是为了研究技术,或者确实需要保护涉密数据,我真不建议去折腾本地部署。 为什么呢? 目前 Ollama 从 1.5B 到 70B 都只是把 R1 的推理能力提炼到 Qwen 和 Llama 的蒸馏版本上。 虽说性能是提升…

极狐GitLab 分支管理功能介绍

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 分支 (BASIC ALL) 分支是项目工作树的一个版本。分支是项目开发的基础。当你创建一个新的项目时,极狐GitLab 会为…

基于ASP.NET+MySQL实现待办任务清单系统

基于ASP.NET的ToDoList的设计与实现 一、前言 1.1 实验目的 使学生综合使用所学过的ASP.NET网络编程知识,掌握网络环境程序设计的基本概念;结合实际的操作和设计,巩固课堂学习内容,掌握网络环境编程的特点、原理和技术&#xf…

普通 html 项目引入 tailwindcss

项目根目录安装依赖 npm install -D tailwindcss3 postcss autoprefixer 初始化生成tailwind.config.js npx tailwindcss init 修改tailwind.config.js /** type {import(tailwindcss).Config} */ module.exports {content: ["./index.html"], //根据自己的项目…

汽车免拆诊断案例 | 2015款奔驰C200L车发动机起动延迟

故障现象  一辆2015款奔驰C200L车,搭载274发动机,累计行驶里程约为15.6万km。该车发动机起动延迟,且发动机故障灯异常点亮。 故障诊断  用故障检测仪检测,发动机控制单元中存储有故障代码“P001685 进气凸轮轴(气缸…

[蓝桥杯 2025 省 B] 水质检测(暴力 )

暴力暴力 菜鸟第一次写题解,多多包涵!!! 这个题目的数据量很小,所以没必要去使用bfs,直接分情况讨论即可 一共两排数据,我们使用贪心的思想,只需要实现从左往右的过程中每个检测器相互连接即…

网络接口返回类ResponseEntity

网络接口返回类ResponseEntity 简介方法获取工厂方法ResponseEntity.ok()返回BodyBuilder返回文字信息返回类对象(Spring自动转换为json格式)返回空内容‌ ResponseEntity.notFound()返回HeadersBuilder返回文字信息 status(HttpStatus)返回BodyBuildern…

Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡

Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡 一、Redis的本质与核心价值 1.1 Redis的技术定位 Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,由Salvatore Sanfilippo于2009年创建。它不同于传…

macOS上管理多个Node.js版本

管理工具 fnm 和 nvm nvm:作为最广泛使用的 Node.js 版本管理器,使用 Bash 编写,适用于类 UNIX 环境(如 macOS 和 Linux),也可以通过兼容的 shell(如 WSL)在 Windows 上使用。fnm:(Fast Node Manager)一种较新的、快速…

uDistil-Whisper:低数据场景下基于无标签数据过滤的知识蒸馏方法

uDistil-Whisper: Label-Free Data Filtering for Knowledge Distillation in Low-Data Regimes 会议:2025年NAACL 机构:卡内基梅降大学 Abstract 近期研究通过伪标签(pseudo-labels)将Whisper的知识蒸馏到小模型中&#xff0…