首页
学习
活动
专区
圈层
工具
发布

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

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

2K10

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

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

1.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    1.5 tomcat是如何打破双亲委派机制的?

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

    1.6K10

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

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

    1.1K30

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

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

    93100

    JVM进阶调优系列(1)类加载器原理一文讲透

    4.3 打破双亲委派机制的方式双亲委派机制并不是一个强制约束,而是 Java 设计者推荐给我们的类加载器的实现方式。所以为了完成某些特定操作,我们可以“打破” 这个机制。...如何打破双亲委派机制?...Tomcat是一个web容器,需要部署多个应用。每个应用的依赖代码可能是不同的版本。比如A应用的fastJson是2.0版本,B应用是3.0版本,里面都有JASONArray类。...但按双亲委派机制,不可以重复加载同一个类。Tomcat 为每个 web 容器单独提供一个 WebAppClassLoader 加载器,通过提供隔离的机制,破坏双亲委派原则。...实现流程大概如下:1、为每一个应用在容器里有单独的 WebAppClassLoader 加载器,该加载器负责只加载应用自身目录下的 class 文件,从而实现隔离。

    28210

    JVM深入原理(六)(二):双亲委派机制

    类加载器-打破双亲委派机制 6.6.1....打破委派-ClassLoader原理 ClassLoader的原理就存在于四个核心方法中 loadClass: 作用:类加载的入口,内部实现双亲委派机制,内部会调用findClass 代码逻辑: 使用...打破委派-打破的场景 Tomcat打破双亲委派机制的原因:Tomcat程序中运行多个Web应用时,如果Web应用中出现相同限定名的类,Tomcat要保证这些类能够正常加载并运行且保证他们是不同的类,Tomcat...就需要打破双亲委派机制 Tomcat打破双亲委派机制的方式:Tomcat为每一个Web应用提供了自定义类加载器来加载对应的类,这样就实现了应用之间的类的隔离 6.6.3....Driver驱动类并创建对象 DriverManager使用ServiceLoader去加载Driver实现类,ServiceLoader中获取线程上下文类加载器去加载实现类 这种由启动类加载器加载的类去委派应用程序类加载器去加载类的方式打破了双亲委派机制

    24810

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

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

    25110

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

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

    36800

    Tomcat 的类加载机制

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

    1.1K10

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

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

    50220

    秒懂双亲委派机制

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

    21410

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

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

    37511

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

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

    2.4K20

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

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

    1.1K20

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

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

    6.2K20

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

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

    64530

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

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

    1.1K30

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

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

    32321
    领券