当前位置: 首页 > news >正文

WebAppClassLoader(Tomcat)和 LaunchedURLClassLoader(Spring Boot)类加载器详解

它们都不是完全抛弃双亲委派机制,而是在特定场景下“打破”或“绕过”了部分双亲委派流程,以满足各自的运行需求。


🔍 先回顾:双亲委派机制

  • 标准流程:类加载请求先委托给父加载器,父加载器找不到才由自己加载
  • 好处:安全(防止核心类被篡改)、避免重复加载、类隔离

🛠 WebAppClassLoader(Tomcat)

  • 用途:隔离不同 Web 应用的类,支持热部署
  • 破坏点
    • Tomcat 的 WebAppClassLoader 在加载类时,会先尝试自己加载(尤其是 WEB-INF/classesWEB-INF/lib 下的类),再委托父加载器
    • 这样可以让 Web 应用自己的类覆盖容器或 JDK 提供的同名类(除了一些受保护的包)
  • 原因
    • 支持应用自带依赖版本
    • 实现应用之间的类隔离
    • 支持热部署(重新加载类)

🛠 LaunchedURLClassLoader(Spring Boot)

  • 用途:支持 Spring Boot 可执行 JAR(fat jar)结构,从 BOOT-INF/classesBOOT-INF/lib 中加载类
  • 破坏点
    • 它继承自 URLClassLoader,但加载逻辑会优先从自身的 URL 列表(fat jar 内部路径)找类,而不是严格先委托父加载器
    • 这样可以让应用打包在 JAR 内的类优先于外部类加载
  • 原因
    • 让 Spring Boot 内嵌依赖优先加载
    • 保证 fat jar 内部的类路径结构可直接运行
    • 避免依赖冲突

📌 总结对比

类加载器是否完全跳过双亲委派破坏方式目的
WebAppClassLoader❌(部分破坏)部分包优先自己加载应用隔离、热部署
LaunchedURLClassLoader❌(部分破坏)优先加载 fat jar 内部类支持可执行 JAR、自带依赖优先

💡 一句话总结
它们都保留了双亲委派的大框架,但在类查找顺序上做了“反转”或“短路”,以满足类隔离、热部署、可执行 JAR等特殊需求。



🎨 类加载流程对比图

🟦 标准双亲委派机制(父优先)
[请求加载类] ⬇️ 委托父加载器⬇️ 父找到 → ✅ 返回类⬇️ 父找不到 → 自己加载🟩 WebAppClassLoader(Tomcat,子优先)
[请求加载类]⬇️ 先检查自己(WEB-INF/classes, WEB-INF/lib)⬇️ 找到 → ✅ 返回类⬇️ 找不到 → 委托父加载器(部分包仍父优先,保护核心类)🟨 LaunchedURLClassLoader(Spring Boot,子优先)
[请求加载类]⬇️ 先检查自己(BOOT-INF/classes, BOOT-INF/lib)⬇️ 找到 → ✅ 返回类⬇️ 找不到 → 委托父加载器(支持 Fat JAR 结构,内嵌依赖优先)

🔍 关键差异

  • 标准双亲委派:父优先,安全性高,避免重复加载
  • WebAppClassLoader:对子类路径(WEB-INF/classesWEB-INF/lib)优先加载,实现应用隔离和热部署
  • LaunchedURLClassLoader:对子类路径(BOOT-INF/classesBOOT-INF/lib)优先加载,支持 Spring Boot 可执行 JAR


文章转载自:

http://upNRGnAH.pjzcp.cn
http://mlZdPPPZ.pjzcp.cn
http://DKPrgVvO.pjzcp.cn
http://yI2PhPhm.pjzcp.cn
http://QNUTFAB5.pjzcp.cn
http://bZ380vdw.pjzcp.cn
http://3G8Q8QMf.pjzcp.cn
http://inCV9E8A.pjzcp.cn
http://U3QdDYcg.pjzcp.cn
http://KGt8rx5N.pjzcp.cn
http://QetFquJ6.pjzcp.cn
http://0kaTMOEi.pjzcp.cn
http://h4S7XHe2.pjzcp.cn
http://gfv7AAeD.pjzcp.cn
http://05rQY743.pjzcp.cn
http://FnCOeaca.pjzcp.cn
http://hefUWDqK.pjzcp.cn
http://CsOJ2qi9.pjzcp.cn
http://pv17lmRN.pjzcp.cn
http://wFeToLbo.pjzcp.cn
http://wbscnOmZ.pjzcp.cn
http://yx82TOJo.pjzcp.cn
http://SDD7Juao.pjzcp.cn
http://CLKJ1hp6.pjzcp.cn
http://hXKtPQlB.pjzcp.cn
http://e5kWGn1l.pjzcp.cn
http://rjlqb49L.pjzcp.cn
http://ZLKPtvMI.pjzcp.cn
http://ImOvdDRX.pjzcp.cn
http://YvANQa9o.pjzcp.cn
http://www.dtcms.com/a/365412.html

相关文章:

  • “路桥养护”--奏响城市交通的安全乐章
  • 前端框架(Vue/React):界面更新的运行链路
  • Kafka Topic(主题)详解
  • 四维轻云:多期地理数据管理的得力助手
  • 14,FreeRTOS二值信号量操作
  • 差分隐私在运营指标:ABP 的 DP 计数器与噪声预算
  • 一文读懂RAG:从生活场景到核心逻辑,AI“查资料答题”原来这么简单
  • Wan2.2AllInOne - Wan2.2极速视频生成模型,4步极速生成 ComfyUI工作流 一键整合包下载
  • Java全栈学习笔记29
  • 关于牙科、挂号、医生类小程序或管理系统项目 项目包含微信小程序和pc端两部分
  • 从一次Crash分析Chromium/360浏览器的悬空指针检测机制:raw_ref与BackupRefPtr揭秘
  • 如何修复“您的连接不是私密连接”警告?
  • sentinel实现控制台与nacos数据双向绑定
  • Android音频学习(十六)——CreateTrack
  • 深度学习——CNN实例手写数字
  • 涉私数据安全与可控匿名化利用机制研究(下)
  • Triton Linalg - WrapFuncBodyWithSingleBlockPass
  • 软件设计师备考-(十) 多媒体基础
  • 两个子进程之间使用命名pipe
  • 如何构建企业级RAG知识库?实战方法、关键细节与平台选型
  • 并发编程——14 线程池参数动态化
  • PyTorch 损失函数与优化器全面指南:从理论到实践
  • 归一化的定义与作用
  • IO进程线程;进程,发送信号;进程,消息队列通信;0903
  • 消息传递模型实现
  • 阿里开源首个图像生成基础模型——Qwen-Image本地部署教程,中文渲染能力刷新SOTA
  • AI 生成内容(AIGC)版权归属引争议:创作者、平台、AI 公司,谁该拥有 “作品权”?
  • 弧焊工业机器人保护气节约的关键
  • Windows/Linux下vscode+vcpkg管理C++包链接方法
  • 相关性分析与常用相关系数