首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Tomcat如何打破双亲委派机制实现隔离Web应用的?(上)

Tomcat 作为一款应用服务器,为了实现隔离 Web 应用,需要在架构设计上打破双亲委派机制。双亲委派是指一个类的加载过程,由一个类加载器(通常是基础类加载器)递归调用其父类加载器的类加载逻辑完成。在 J2EE 规范中,规定应用服务器要默认使用一个基础类加载器作为双亲委派模型的起始点,从而保证应用服务器中所有类都从基础类加载器加载。

想要打破双亲委派机制,Tomcat 的架构设计可以分为以下几个步骤:

  1. 自定义一套类加载器体系

Tomcat 通过实现一套扩展的类加载器体系,来突破双亲委派机制。这包括创建多个独立的类加载器,每个类加载器负责加载一个应用服务器应用和相关的依赖。这些类加载器互相独立,不会触发递归加载,从而实现应用的独立加载。

  1. 打破双亲委派核心方法,实现自定义类加载器上下文共享与隔离

在 Tomcat 中,我们需要重写 ClassLoader.loadClass() 方法,在创建类加载器上下文之前设置双亲委派逻辑,并实现自定义类加载器上下文共享与隔离。通过这种方式,每个自定义类加载器都能独立地实现自己的类加载。

  1. 利用 WebAppClassLoader 实现 Web 应用的隔离

Tomcat 使用一个特殊的类加载器 WebAppClassLoader 实现 Web 应用的隔离。WebAppClassLoader 会优先加载当前 Web 应用中的类,实现了 Web 应用之间的隔离。

综上,Tomcat 在架构设计上打破了经典的 J2EE 双亲委派模型,实现了一套类加载器体系,使得不同应用能够在服务器上独立加载运行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Tomcat如何打破双亲委派机制实现隔离Web应用

Tomcat通过自定义类加载器WebAppClassLoader打破双亲委派,即重写了JVM类加载器ClassLoaderfindClass方法和loadClass方法,以优先加载Web应用目录下类...这就相当于在JVM内部创建相互隔离Java类空间,每个Web应用都有自己类空间,Web应用之间通过各自类加载器互相隔离。...SharedClassLoader 两个Web应用之间怎么共享库类,并且不能重复加载相同类? 双亲委派机制各子加载器都能通过父加载器去加载类,于是考虑把需共享类放到父加载器加载路径。...CatalinaClassLoader 如何隔离Tomcat本身类和Web应用类? 兄弟关系:两个类加载器是平行,它们可能拥有同一父加载器,但两个兄弟类加载器加载类是隔离。...总结 TomcatContext组件为每个Web应用创建一个WebAppClassLoader类加载器,由于不同类加载器实例加载类是互相隔离,因此达到了隔离Web应用目的,同时通过CommonClassLoader

1.7K10

Tomcat如何打破双亲委派机制实现隔离Web应用

Tomcat通过自定义类加载器WebAppClassLoader打破双亲委派,即重写了JVM类加载器ClassLoaderfindClass方法和loadClass方法,以优先加载Web应用目录下类...所以,和 JVM 一样,需要隔离Tomcat本身类和Web应用类。 Tomcat类加载器层次结构 Tomcat类加载器层次结构 前三个是加载器实例名,不是类名。...SharedClassLoader 两个Web应用之间怎么共享库类,并且不能重复加载相同类? 双亲委派机制各子加载器都能通过父加载器去加载类,于是考虑把需共享类放到父加载器加载路径。...CatalinaClassLoader 如何隔离Tomcat本身类和Web应用类? 兄弟关系:两个类加载器是平行,它们可能拥有同一父加载器,但两个兄弟类加载器加载类是隔离。...总结 TomcatContext组件为每个Web应用创建一个WebAppClassLoader类加载器,由于不同类加载器实例加载类是互相隔离,因此达到了隔离Web应用目的,同时通过CommonClassLoader

1.1K20
  • 1.5 tomcat如何打破双亲委派机制?

    一. tomcat如何打破双亲委派机制? 首先, 来举个例子, 通常,一个tomcat要加载几个应用程序呢?...因为tomcat打破双亲委派机制, 下面我们就来看看tomcat如何打破双亲委派机制? 如上图, 上面的橙色部门还是和原来一样, 采用双亲委派机制....而黄色部分是tomcat第一部分自定义类加载器, 这部分主要是加载tomcat包中类, 这一部分依然采用双亲委派机制, 而绿色部分是tomcat第二部分自定义类加载器, 正事这一部分, 打破了类双亲委派机制...而这个类加载器打破双亲委派机制. 我们可以想象一下, 加入这个webapp类加载器没有打破双亲委派机制会怎么样?...下面我们来实现一个自定义类加载器 二. 自定义tomcatwar包类加载器 如何打破双亲委派机制, 我们已经写过一个demo了.

    1.3K10

    类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制如何实现

    Launcher启动类 本文是双亲委派机制源码分析部分,类加载机制双亲委派模型对于jvm稳定运行是非常重要 不过源码其实比较简单,接下来简单介绍一下 我们先从启动类说起 有一个Launcher...父 意味着他一层级 getSystemClassLoader 获取AppClassLoader 过程 ?...显然这就完成了一整个双亲委派类加载模式 ?...,也就是双亲委派机制 每个层级都会向上传递类加载请求,只有上层  父     类加载器调用失败,才会自己尝试加载 双亲委派机制意义重大,带来了更高安全性等优点 不过他实现逻辑却是的确很简单...一个loadClass就搞定了 findClass是类加载器自身加载类具体行为 所以,如果你不需要破坏双亲委派机制,只需要覆盖这个方法即可 如果你想要完全自定义你类加载器逻辑机制

    1K30

    聊聊类加载器与双亲委派模型

    ClassLoader 如何工作 聊完双亲委派模型,你肯定想知道它是如何实现,那么来看一下 ClassLoader 核心方法,其中 loadClass 方法就是实现双亲委派机制关键,为了缩短代码篇幅和方便阅读...我们常使用 Tomcat类加载器就打破双亲委派机制,当然还有一些其他场景也打破了,比如涉及 SPI 加载动作、热部署等等。 接下来来看看 Tomcat 为什么打破双亲委派模型以及实现机制。...Tomcat如何打破双亲委派机制 为什么打破 现在都流行使用 springboot 开发 web 应用Tomcat 内嵌在 springboot 中。...web 应用类库都是独立,需要实现隔离。...小结 这篇文章主要总结了类加载器双亲委派模型、双亲委派工作机制、以及Tomcat如何打破双亲委派,当然有一些东西分享比较简单,比如 Tomcat 类加载器这部分,没有提及整个 Tomcat类加载器层次结构

    81500

    Tomcat源码分析 】深入探索:Tomcat 类加载机制揭秘

    双亲委任模型时如何实现 非常简单,双亲委派模型核心逻辑体现在 java.lang.ClassLoader 中 loadClass 方法中。 首先判断若类尚未加载,则委派父加载器尝试加载。...如何破坏双亲委任模型 双亲委派模型并非强制性约束,而是 Java 设计者推荐类加载器实现方式。虽然大部分类加载器都遵循这一模型,但也有例外。迄今为止,双亲委派模型曾三次被“打破”。...这相当于父类加载器请求子类加载器完成类加载,打破双亲委派模型层次结构,逆向使用类加载器,实际已经违背了模型一般性原则。...Tomcat 如何实现自己独特类加载机制 首先看下 Tomcat 设计图: 观察这张图,我们看到了多个类加载器,其中除了 JDK 自带类加载器之外,我们尤其关注 Tomcat 自身持有的类加载器。...WebApp 类加载器 为每个 Web 应用单独创建,负责加载该应用类,这些类在 Tomcat 和其他应用中不可见,确保了应用之间隔离

    7010

    一步之差进入大厂,下定决心钻透java所有面试题,顺利通过!

    打破双亲委派机制 再来一个沙箱安全机制示例,尝试打破双亲委派机制,用自定义类加载器加载我们自己实现java.lang.String.class ​ ​ ​ ​ Tomcat打破双亲委派机制 以...Tomcat类加载为例,Tomcat 如果使用默认双亲委派类加载机制行不行?...,每个war包应用都有自己WebappClassLoader,实现相互隔离,比如不同war包应用引入了不同spring版本, 这样实现就能加载各自spring版本; 从图中委派关系中可以看出:...tomcat 这种类加载机制违背了java 推荐双亲委派模型了吗?答案是:违背了。...很显然,tomcat 不是这样实现tomcat 为了实现隔离性,没有遵守这个约定,每个webappClassLoader加载自己目录下class文件,不会传递给父类加载器,打破双亲委派机制。 ​

    31800

    Tomcat 类加载机制

    在前面 Java虚拟机:对象创建过程与类加载机制双亲委派模型 文章中,我们介绍了 JVM 类加载机制以及双亲委派模型,双亲委派模型类加载过程主要分为以下几个步骤: (1)初始化 ClassLoader...最经典例子就是 Tomcat 容器类加载机制了,它实现了自己类加载器 WebApp ClassLoader,并且打破双亲委派模型,在每个应用在部署后,都会创建一个唯一类加载器。...要实现自己类加载机制: WebAppClassLoader 加载类时候,故意打破了JVM 双亲委派机制,绕开了 AppClassLoader,直接先使用 ExtClassLoader...最主要原因是保证部署在同一个 Web 容器不同 Web 应用程序所使用类库可以实现相互隔离,避免不同项目的相互影响。...小结:Tomcat 实际只有 WebAppClassLoader 加载器中打破双亲委派,其他类加载器还是遵循双亲委派

    82010

    性能优化|全面剖析类加载机制

    如何打破双亲委派机制 我们如果需要打破双亲委派机制,只需要自己实现loadClass方法,不再去询问父类中是否加载过我们需要字节码文件,然后直接调用findClass加载我们类就行了。...tomcat为什么要打破双亲委派机制? 以Tomcat类加载为例,Tomcat 如果使用默认双亲委派类加载机制行不行?...我们思考一下:Tomcat是个web容器, 那么它要解决什么问题: 一个web容器可能需要部署两个应用程序,不同应用程序可能会依赖同一个第三方类库不同版本,不能要求同一个类库在同一个服务器只有一份,...再看看我们问题:Tomcat 如果使用默认双亲委派类加载机制行不行?答案是不行。为什么?...,实现相互隔离,比如不同war包应用引入了不同spring版本,这样实现就能加载各自spring版本; 几个类加载器之间关系图 ?

    39420

    秒懂双亲委派机制

    如何保证加载完整性? 为了解决上面的这一系列问题,我们必须要引入某一套机制,这套机制就是:双亲委派机制。 2 什么是双亲委派机制? 接下来,我们看看什么是双亲委派机制。...有了线程上下文加载器,JNDI服务就可以使用它去加载所需要SPI代码,也就是父类加载器请求子类加载器去完成类加载动作,这样就打破双亲委派机制。...也就是说,有些公共依赖包,最好能够只加载一次。 我们还需要将Tomcat本身类,跟Web应用隔离开。 这些原因导致,Tomcat没有办法使用传统双亲委派机制加载类了。...那么,Tomcat加载类机制是怎么样? CommonClassLoader:是Tomcat最基本类加载器,它加载类可以被Tomcat容器和Web应用访问。...WebAppClassLoader:各个Web应用私有的类加载器,加载类只对当前Web应用可见。比如不同war包应用引入了不同Spring版本,这样能加载各自Spring版本,相互隔离

    9610

    【Java编程进阶之路 04】深入探索:Java类加载器与双亲委派 & 打破双亲委派桎梏

    热部署和热替换:在某些场景下,如Web应用服务器(如Tomcat)中,可能需要实现热部署和热替换功能,即在不重启服务器情况下,动态地加载和替换类。...05 如何打破双亲委派模型 在Java中,打破双亲委派模型通常是为了满足一些特殊需求,比如实现热部署、插件化、或者加载一些非核心类库代码。...这种机制主要用途是允许在一个线程中运行代码使用不同于创建该线程时所使用类加载器来加载类和资源。这对于在Web服务器(如Tomcat)中实现插件化、热部署等功能非常有用。...请注意,这个示例仅用于演示如何打破双亲委派模型,并不是一个完整、可用于生产环境类加载器实现。在实际应用中,自定义类加载器可能需要处理更多边界情况和安全性问题。...记住,虽然OSGi打破双亲委派模型,但它仍然提供了一种机制来确保类加载一致性和隔离性。这是通过类加载器层次结构和适当类加载策略实现

    17111

    一文讲透 Tomcat 类加载机制!揭秘类加载核心

    不知道你发现没有,如果你要打破双亲委托机制,就需要重写 loadClass 方法,因为 loadClass 默认实现就是双亲委托机制。...- Tomcat 类加载机制 - 1、加载机制特点 隔离性:Web应用类库相互隔离,避免依赖库或者应用包相互影响。...如果 釆用一个类加载器,显然无法实现,因为只有一个类加载器时候,类之间依赖是杂 乱无章,无法完整地移除某个Web应用类; 性能:由于每个Web应用都有一个类加载器,因此Web应用在加载类时,不会搜索其他...tomcat 8.5 默认改变了严格双亲委派机制: 从缓存中加载; 如果缓存中没有,会先调用ExtClassLoader进行加载, 扩展类加载器是遵循双亲委派,他会调用bootstrap,查看对应...总结:tomcat打破双亲委派原则,实际是在应用类加载器中打破双亲委派,其他类加载器还是遵循双亲委派

    1.7K20

    Tomcat - 模拟TomcatwebappClassLoader加载自己war包应用内不同版本类实现相互共存与隔离

    Pre Tomcat - 都说Tomcat违背了双亲委派机制,到底对不对?...JVM-白话聊一聊JVM类加载和双亲委派机制源码解析 JVM - 实现自定义ClassLoader就是这么简单 ---- Tomcat要解决什么问题?...作为一个Web容器,Tomcat要解决什么问题 , Tomcat 如果使用默认双亲委派类加载机制能不能行?...也不尽然,核心Java加载还是遵从双亲委派Tomcat中 各个web应用自己类加载器(WebAppClassLoader)会优先加载,打破双亲委派机制。...加载不到时再交给commonClassLoader走双亲委托 . ---- 模拟TomcatwebappClassLoader加载自己war包应用内不同版本类实现相互共存与隔离 我们基于JVM - 实现自定义

    94320

    我真不信,这年头还有人能懂SpringBootClassLoader加载机制

    熟悉Tomcat工作原理的人应该知道,Tomcat内部实现了自定义类加载器,打破了Java双亲委派机制,下面我们先看看什么是双亲委派机制。...双亲委派机制 双亲委派机制是指Java类加载器收到一个类加载请求时,该类加载器首先会把请求委派给父类加载器。...如果使用JDK默认双亲委派模式,Tomcat类加载器可以加载吗?我们思考一下Tomcat作为一个Web容器使用场景。 在Web容器中,可能同时需要部署两个以上应用程序。...所以Tomcat团队设计了自己独特类加载机制,解决上面的应用jar包冲突等问题,通过自定义类加载机制可以完美地解决Tomcat容器中不同应用隔离问题。...Tomcat容器作为主线程父类加载器来加载不同应用Tomcat独特WebApp ClassLoader各自加载不同目录下War包应用应用之间使用ClassLoader实现了很好隔离

    4.3K20

    那些有趣代码(二)--偏不听父母话 Tomcat 类加载器

    Tomcat 源码越看越有趣。Tomcat 代码总有一种处处都有那么一点调皮感觉。今天就聊一聊 Tomcat 类加载机制。 了解过 JVM 类加载一定知道,JVM 类加载双亲委派机制。...但是 Tomcat打破了 JVM 固有的双亲委派加载机制。 JVM 类加载 首先需要明确一下类加载是什么?...双亲委派机制: 所谓双亲委派机制,这里要指出是,其实双亲委派来源于英文 ”parents delegate“,仅仅表示只是”父辈“,可见翻译的人不但英文是半吊子,而且也不了解 JVM 类加载策略...WebAppClassLoader 我们就来看看 Tomcat 类加载器是怎么打破双亲委派机制。...由保证了在同一个 Tomcat 下不同 web 之间 class 是相互隔离

    54730

    Tomcat - 都说Tomcat违背了双亲委派机制,到底对不对?

    它可以从不同文件目录加载,也可以从不同 jar 文件中加载,也可以从网络不同静态文件服务器来下载字节码再加载。 ---- JVM 双亲委派机制 ? Java1.2之后引入双亲委派模式 。...作为一个Web容器,Tomcat要解决什么问题 , Tomcat 如果使用默认双亲委派类加载机制能不能行?...web容器 自己依赖类库 (tomcat lib目录下),不能与应用程序类库混淆。基于安全考虑,应该让容器类库和程序类库隔离开来。 ?...第二个问题,默认类加载器是能够实现,很好理解嘛, 就是双亲委派功能,保证唯一性。...Tomcat中 各个web应用自己类加载器(WebAppClassLoader)会优先加载,打破双亲委派机制。加载不到时再交给commonClassLoader走双亲委托 .

    93830

    Tomcat类加载器揭秘:“重塑”双亲委派模型

    Tomcat类加载器揭秘:“重塑”双亲委派模型在Java世界中,类加载器作为程序运行时动态加载类基石,遵循着经典双亲委派模型原则,这一设计确保了类唯一性和安全性然而,在某些特殊应用场景下,如应用服务器领域...,传统双亲委派模型需要被巧妙地“重塑”以满足更复杂需求Apache Tomcat,作为最流行Java Web应用服务器之一,正是这样一个打破常规、挑战传统典范本文,我们将踏上一段深度探索之旅,揭秘...Tomcat如何以及为何要打破Java双亲委派模型双亲委派模型先来复习下类加载器相关知识(也可以查看类加载器文章):JVM运行时遇到类需要检测类是否加载,如果未加载则将类信息加载到运行时方法区并生成...,应用类加载器则常用于加载我们自定义类扩展、应用类加载器由Java代码实现,组合为父子关系(不是继承)默认情况下类加载会使用双亲委派模型:进行类加载时将类交给父类尝试加载,如果父类不加载再由自己加载,...这种核心类库被篡改,它们由父类加载器进行加载,因此加载时找不到我们编写main方法Tomcat类加载器既然双亲委派模型能够防止核心类库被篡改,那么Tomcat为啥还要打破双亲委派模型呢?

    12121

    JVM常见面试题(三):类加载器,双亲委派模型,类装载执行过程

    通过加载字节码数据放入内存转换成byte[],接下来调用虚拟机底层方法将byte[]转换成方法区和堆中数据1.2 应用场景企业级应用SPI机制热部署Tomcat隔离大量面试题什么是类双亲委派机制打破双亲委派机制自定义类加载器解决线上问题使用...但是有的时候我们不得不打破双亲委派机制,例如:一个Tomcat容器中可以运行多个WEB应用,而如果这两个应用中出现了同名A类,那么Tomcat就要保证这两个A类都被加载并且是各自不同类。...如果不打破双亲委派机制,那么WEB1中A类记载后,WEB2中自己A类就不会加载成功了,按照双亲委派机制来讲,此时会直接返回WEB1中A类。此时我们就需要打破双亲委派机制。...2.3 打破双亲委派机制打破双亲委派机制三种方式:自定义类加载器自定义类加载器并且重写loadClass方法,就可以将双亲委派机制代码去除Tomcat通过这种方式实现应用之间类隔离线程上下文加载器利用上下文类加载器加载类...为了安全,保证类库API不会被修改(6)怎么打破双亲委派机制重写loadClass方法,不再实现双亲委派机制JNDI、JDBC、JCE、JAXB和JBI等框架使用了SPI机制+线程上下文类加载器OSGi

    6910

    tomcat类加载-源码解析

    其次tomcat项目怎么隔离?其三tomat如何打破双亲委派机制? 相关基础 java类如何加载? 这个问题建议阅读我以往文章,有这个基础会更好了解如下。...文章: ‍类加载时机 ‍ jvm类加载器(classloader)及类加载过程 以前画图,比较丑,别介意哈~ 打破双亲委派机制 那么如何打破双亲委派机制,可以参考另一个文章:如何打破双亲委派机制...tomcat为什么要打破双亲委派机制?...; 支持热部署:新项目加载或部署不会影响正在运行项目; tomcat打破双亲委派机制实现源码 代码位置:org.apache.catalina.loader.WebappClassLoaderBase...tomcat类加载机制,特别是阅读过源码后你会发现非常简单,只是针对Classloader进行重新,根据自已需求进行判断路劲是通过双亲委派机制进行加载,还是通过自定类加载器进行加载,所以这块建议学习同学通过源码来学习会快很多

    46230

    Java类加载机制Tomcat类加载器架构

    Java类加载机制 类加载器 虚拟机设计团队把类加载阶段中“通过一个类全限定名来获取描述此类二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要类...有了这一前提,我们需要通过自定义类加载器绕过双亲委派机制实现自定义类加载。...SPI代码,这种行为实际就是打通了双亲委派模型层次结构来逆向使用类加载器,实际已经违背了双亲委派模型一般性原则,但这也是无可奈何事情。...因为一个功能健全Web容器,要解决如下几个问题: 1)部署在同一个Web容器两个Web应用程序所使用Java类库可以实现相互隔离。...为了支持这套目录结构,并对目录里面的类库进行加载和隔离Tomcat自定义了多个类加载器,这些类加载器按照经典双亲委派模型来实现,其关系如下图所示。

    36930
    领券