当前位置: 首页 > 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://www.xdnf.cn/news/1444357.html

相关文章:

  • Llama v3 中的低秩自适应 (LoRA)
  • 51单片机-LED与数码管模块
  • 2024 arXiv Cost-Efficient Prompt Engineering for Unsupervised Entity Resolution
  • JetBrains 2025 全家桶 11合1 Windows直装(含 IDEA PyCharm、WebStorm、DataSpell、DataGrip等)
  • Datawhale AI夏令营复盘[特殊字符]:我如何用一个Prompt,在Coze Space上“画”出一个商业级网页?
  • 终于有人把牛客网最火的Java面试八股文整理出来了,在Github上获赞50.6K
  • 使用 PHP Imagick 扩展实现高质量 PDF 转图片功能
  • 特斯拉“宏图计划4.0”发布!马斯克:未来80%价值来自机器人
  • 超适合程序员做知识整理的 AI 网站
  • SQL 函数:使用 REPLACE进行批量文本替换
  • 嵌入式第四十五天(51单片机相关)
  • Windows 电源管理和 Shutdown 命令详解
  • 2025版基于springboot的电影购票管理系统
  • 【Canvas与图标】汽车多彩速度表图标
  • 汽车工装结构件3D扫描尺寸测量公差比对-中科米堆CASAIM
  • 1分钟生成爆款相声对话视频!Coze智能体工作流详细搭建教程,小白也能轻松上手
  • 后端框架(SpringBoot):自动配置的底层执行流程
  • 【开题答辩全过程】以 基于微信小程序的“XIN”学生组织管理系统为例,包含答辩的问题和答案
  • 【题解】Codeforces Round 1046 (Div. 1) A~C
  • 指针高级(2)
  • Spring Boot HTTP状态码详解
  • 关于linux数据库编程——sqlite3
  • Spring二级缓存为什么不行(详细)
  • Docker学习笔记(一):容器基础、生态与安装实践
  • 鸿蒙NEXT开发实战:图片显示、几何图形与自定义绘制详解
  • 编辑器vim(Linux)
  • 【Python接口自动化】调用飞书机器人
  • 树莓派 AT 指令串口助手
  • Mysql学习第五天 Innodb底层原理与Mysql日志机制深入剖析
  • K8s生产级Redis集群:Operator模式实现自动扩缩容 详细内容