首页 > 其他分享 >深入源代码,探秘Tomcat类加载机制:为何颠覆双亲委派原则(1)?

深入源代码,探秘Tomcat类加载机制:为何颠覆双亲委派原则(1)?

时间:2024-12-02 15:58:35浏览次数:7  
标签:委派 Tomcat 双亲 机制 源代码 探秘 class 加载

1.什么是双亲委派

  jvm启动后会通过其类装载子系统,去硬盘上找xxx.class文件,找到之后,会直接将xxx这个类装载到java虚拟机中,这个过程叫做类的加载。而类的加载过程中就涉及到了双亲委派。

  类加载机制的双亲委派(Parent Delegation Model)是Java中的一种类加载策略,旨在确保Java应用程序的安全性和一致性。其基本原理如下:

  1. 加载顺序:当一个类加载器接到加载某个类的请求时,它首先会将该请求委派给它的父类加载器。如果父类加载器能够加载这个类,则请求返回给调用者;如果父类加载器无法加载该类,加载请求才会被当前类加载器处理。

  2. 层级结构:Java的类加载器通常以树形结构组织,顶层是引导类加载器(Bootstrap ClassLoader),接下来是扩展类加载器(Extension ClassLoader)和应用类加载器(Application ClassLoader)。每个加载器都有自己的父加载器。

  3. 避免重复加载:通过这种机制,Java避免了同一个类被多个类加载器加载的情况,从而防止类的冲突和版本不一致的问题。例如,如果系统中有两个不同版本的同一类,双亲委派机制确保只有一个版本会被加载,避免了潜在的错误和不兼容。

  4. 安全性:双亲委派机制也增强了Java的安全性,因为它优先加载Java核心类库中的类,而不是用户自定义的类。这意味着用户无法轻易地替换系统核心的类,防止了潜在的安全漏洞。

  双亲委派整体流程如下图:

2.Tomcat为什么需要打破双亲委派呢

  首先需要明确,在jvm中一个class对象是否唯一,主要依赖于类加载器和类的全限定名,如果二者均一样,那么说明两个class对象一样。

  那么问题来了,tomcat是一个servlet容器,再该容器下我们可以部署多个项目,如果仅依赖于全局的类加载机制(双亲委派机制),那么如果我们在该容器下部署了两个项目,项目中均存在一个全限定名为com.controller.HelloWord的类,但是该类的方法和属性完全不同。如果按照双亲委派机制使用全局的Application ClassLoader来加载该类,那么该类因为类加载器和全限定名一致,所以只会被加载一次,这样就会存在问题。所以Tomcat通过自定义加载器的方式打破了双亲委派机制。

  注意:所谓的打破并不是完全不遵守双亲委派机制,Tomcat通过为每个context(项目)定义自己的WebAppClassLoader,加载项目内的class对象,对于一些公共的,比如jdk提供的数据类型等还是要走双亲委派机制。

3.Tomcat的类加载机制

  Tomcat的启动加载跟普通项目一样,因为其本身就是一个Java项目,有自己的main方法启动类,但是Tomcat在jvm的基础上自定义了很多类加载器,其整体工作流程如下:

   上面的橙色部门还是和原来一样, 采用双亲委派机制。 而黄色部分是Tomcat第一部分自定义的类加载器,这部分主要是加载Tomcat包中的类,这一部分依然采用的是双亲委派机制,而绿色部分是Tomcat第二部分自定义类加载器,正是这一部分,打破了类的双亲委派机制。下面我们就来详细看看Tomcat自定的类加载器:

  • commonClassLoader: tomcat最基本的类加载器, 加载路径中的class可以被tomcat容器本身和各个webapp访问,如Servlet规范相关包和一些通用工具包;

  • catalinaClassLoader: tomcat容器中私有的类加载器, 加载路径中的class对于webapp不可见。

  • sharedClassLoader: 各个webapps共享的类加载器, 加载路径中的class对于所有的webapp都可见, 但是对于tomcat容器不可见。

  • WebappClassLoader:各个Webapp私有的类加载器,加载路径中的class只对当前Webapp可见;每一个应用会创建一个该对象实例进行加载  其加载目录为每个应用的WEB-INF/class以及lib。

  注意:再高版本的Tomcat中,黄色部分进行了合并(默认情况下三个加载器使用了同一个,但是通过配置仍可以恢复成三个不一样的类加载器),合并后的工作流程如下:

4.从源码层面探究Tomcat的类加载机制

    Tomcat也是一个Java项目,其启动时也是执行Bootstrap中的main方法,如下图:

  接下来我们就详细的看一下initClassLoaders(),是如何初始化类加载器以及他们的关系:

深入源代码,探秘Tomcat类加载机制:为何颠覆双亲委派原则(2)?-CSDN博客

标签:委派,Tomcat,双亲,机制,源代码,探秘,class,加载
From: https://blog.csdn.net/qq_26733517/article/details/144187816

相关文章

  • Java 多线程探秘:核心概念与实用技巧全解析
    1.有三个线程T1,T2,T3,如何保证顺序执行?要确保三个线程T1,T2,和T3按顺序执行,你可以使用多种同步机制。以下是几种常见的方法:Join方法启动T1线程。调用T1.join(),这将使当前线程(假设是主线程)等待直到T1完成。启动T2线程,并调用T2.join()。最后启动T3线程,并......
  • Java设计模式——适配器模式的精妙应用:探秘 JDK 源码中的 Set 类
    在Java编程的世界里,JDK源码犹如一座神秘的宝藏,其中的Set类更是我们日常开发中频繁使用的利器。今天,就让我们像勇敢的探险家一样,深入JDK源码,揭开Set类的神秘面纱,重点剖析适配器模式在其中的巧妙应用,看看它是如何让Set类焕发出独特魅力的!......
  • 第三章:MiniTomcat 之连接器(Connector)组件大揭秘:构建强大服务器的关键一步!
    第三章:MiniTomcat系列——实现连接器(Connector)组件上一章内容:第二章:解析HTTP请求,支持静态文件-MiniTomcat各位技术大神和爱好者们,今天我们要深入探索MiniTomcat中一个超级重要的组件——连接器(Connector)。它就像一座桥梁,连接着客户端与服务器,让信息在两者之间顺畅......
  • Tomcat(48)如何在Tomcat中配置单点登录(SSO)?
    在Tomcat中配置单点登录(SSO)通常涉及使用容器管理的安全性(如使用SingleSign-OnRealm)或集成第三方SSO解决方案。以下是一个使用Tomcat内置的SingleSign-On特性的配置示例。步骤1:配置Tomcat的SingleSign-OnRealm首先,你需要在Tomcat的conf/server.xml文件中配置Single......
  • Tomcat(47)什么是Tomcat的JAAS Realm?
    JAAS(JavaAuthenticationandAuthorizationService)是Java平台的一个标准API,用于处理应用程序的认证和授权。Tomcat支持将JAAS作为其Realm实现之一,这意味着你可以使用JAAS来管理Tomcat中的用户认证和授权。什么是JAASRealm?JAASRealm是Tomcat中的一种Realm实现,它允许你......
  • 短视频源代码,常用的首屏加载优化方式
    短视频源代码,常用的首屏加载优化方式这部分其实就是把从获取资源到页面呈现中可以优化的点提取出来1.DNS预解析不需要用户点击链接就在后台解析,在head中添加<linkrel="dns-prefetch"href="//example.com"> 但是要注意会增加一定的网络请求和带宽消耗,非必要域......
  • 实战评测Qwen2.5-Coder:开源代码大模型的性价比之选?
    引言在人工智能快速发展的今天,代码生成大模型作为重要的开发工具,正在深刻改变着软件开发的方式。阿里云通义千问团队最新发布的Qwen2.5-Coder系列模型,不仅标志着开源代码大模型的重大突破,更展现了中国AI技术在全球舞台上的实力。之前正好研究了一下通义千问的代码模式,单网......
  • Z2400038 Java+Mysql+ssm+layui+freemarker的学生成绩管理系统的设计与实现(源代码 PPT
    学生成绩管理系统1.项目描述2.运行环境3.项目技术4.界面展示5.源码获取1.项目描述SSM+Layui+Freemarker学生成绩管理系统项目概述本项目旨在开发一个基于SSM(Spring+SpringMVC+MyBatis)框架的学生成绩管理系统,结合了Layui前端框架和Freemarker模板引擎,为用......
  • VS Code使用Git可视化管理源代码详细教程
    VSCode简介:官网下载地址:https://code.visualstudio.com/VisualStudioCode是一个轻量级但功能强大的源代码编辑器,可在您的桌面上运行,并且可用于Windows,macOS和Linux。它具有对JavaScript,TypeScript和Node.js的内置支持,并具有丰富的其他语言(例如C++,C#,Java......
  • 从零打造基础HTTP服务器:揭秘背后的技术魔法-MiniTomcat
    ......