tomcat与自定义类加载器

这篇具有很好参考价值的文章主要介绍了tomcat与自定义类加载器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

类加载器与类的”相同“判断

类加载器除了用于加载类外,还可用于确定类在Java虚拟机中的唯一性。
不同类加载器加载的类在 JVM 看来是两个不同的类,因为在 JVM 中一个类的唯一标识是 类加载器+类名(包括包名)。

类加载器种类

启动类加载器,Bootstrap ClassLoader,加载JAVA_HOME\lib,或者被-Xbootclasspath参数限定的类
扩展类加载器,Extension ClassLoader,加载\lib\ext,或者被java.ext.dirs系统变量指定的类
应用程序类加载器,Application ClassLoader,加载ClassPath中的类库
自定义类加载器,通过继承ClassLoader实现,一般是加载我们的自定义类
tomcat与自定义类加载器

双亲委派的关键源代码

JVM 在触发类加载时调用的是 ClassLoader.loadClass 方法。这个方法的实现了双亲委派:先检查指定类(应该仅是包名+类名,不包括类加载器)是否已经被加载过;
若否则递归调用父类加载器的loadClass()方法查询,(父类非指继承,而是指组合的parent变量);
若递归调用失败,就调用本ClassLoader的findClass()进行加载。

我:简单来说,若不想破坏双亲委派,则不要改loadClass()方法,只能改findClass()。

JAVA热部署

首先谈一下何为热部署(hotswap),热部署是在不重启 Java 虚拟机的前提下,能自动侦测到 class 文件的变化,更新运行时 class 的行为。
一种实现的方法是创建自己的 classloader 来加载需要监听的 class,这样就能控制类加载的时机,从而实现热部署:

1、销毁自定义classloader(被该加载器加载的class也会自动卸载);

2、更新class

3、使用新的ClassLoader去加载class

Tomcat独特的类加载机制1,2

tomcat为什么要使用自定义类加载器?

tomcat与自定义类加载器
一个tomcat中可以部署多个应用,而每个应用中都存在很多类,并且各个应用中的类是独立的,全类名是可以相同的,比如一个博客系统中可能存在com.data.User类,一个库存系统中可能也存在com.data.User类。
一个tomcat,不管内部部署了多少应用,Tomcat启动之后就是一个Java进程,也就是一个JVM,所以如果Tomcat中只存在一个类加载器,比如默认的AppClassLoader,那么就只能加载一com.data.User类,这是有问题的 .

Tomcat如何实现自己独特的类加载机制?

Tomcat有多种类加载器。其中WebApp类加载器和Jsp类加载器通常会存在多个实例,每一个Web应用程序对应一个WebApp类加载器,每一个JSP文件对应一个Jsp类加载器:
WebappClassLoader是各个Webapp私有的类加载器,加载路径中的class只对当前Webapp可见。WebAppClassLoader可以使用SharedClassLoader加载到的类,但各个WebAppClassLoader实例之间相互隔离。
而JasperLoader的加载范围仅仅是这个JSP文件所编译出来的那一个.Class文件,它出现的目的就是为了被丢弃:当Web容器检测到JSP文件被修改时,会替换掉目前的JasperLoader的实例,并通过再建立一个新的Jsp类加载器来实现JSP文件的HotSwap功能。

使用自定义类加载器解决JAR包多版本冲突问题3

症状:让sdk-1.0与sdk-2.0并存于项目,会导致如下状况:
tomcat与自定义类加载器
解决:自定义classloader,使得两个版本的jar包使用两个不同的classloader,这样就可以实现多个同类但不同版本的jar包并存:
tomcat与自定义类加载器

其它方案:1、微服务化,一个版本一个服务;2、shaded,参考本博----用shade打包来解决jar包冲突

附:

一些其他参考文章:
Java 类加载机制(阿里)-何时初始化类
知乎----如何实现Java类隔离加载?


  1. 头条:在tomcat中,为什么要使用自定义类加载器? ↩︎

  2. 深入理解 Tomcat(四)Tomcat 类加载器之为何违背双亲委派模型 ↩︎

  3. 基于sofaark轻松实现不同版本jar包类隔离机制 ↩︎文章来源地址https://www.toymoban.com/news/detail-515230.html

到了这里,关于tomcat与自定义类加载器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Winform自定义控件与自定义属性的简单使用

    Winform自定义控件和属性的学习  最近新文章:C#Winform批量获取CSV内容展示,并保存 目录 一、自定义控件的使用 1.在Winform程序中添加新建项,选择Windows窗体用户控件 2.拖拽使用自定义控件到主窗体中 注意点① : 二、自定义控件的自定义属性 1.在自定义控件中添加一个控件

    2023年04月15日
    浏览(38)
  • MPI内置类型与自定义类型

    MPI_CHAR: 字符型 MPI_UNSIGNED_CHAR: 无符号字符型 MPI_BYTE: 字节型 MPI_SHORT: 短整型 MPI_UNSIGNED_SHORT: 无符号短整型 MPI_INT: 整型 MPI_UNSIGNED: 无符号整型 MPI_LONG: 长整型 MPI_UNSIGNED_LONG: 无符号长整型 MPI_FLOAT: 单精度浮点型 MPI_DOUBLE: 双精度浮点型 MPI_LONG_DOUBLE: 长双精度浮点型 MPI_Type_contiguou

    2024年02月10日
    浏览(50)
  • “深入理解网络科学与自定义网络构建“

    1.1 什么是网络? 在计算机科学中,网络是一种将多个设备连接在一起,实现信息共享和通信的技术。网络的发展可以追溯到20世纪,最早用于军事通信。随着互联网的普及,网络变得无处不在。现代网络分层模型包括OSI模型和TCP/IP模型,每一层都有特定的功能和责任。 子网

    2024年01月19日
    浏览(35)
  • python实现科学计算与自定义手绘风

    目标: 1.运用科学计算库进行矩阵分析和数值运算; 2.掌握numpy库的使用。 要点:这是一个使用 numpy 和 PIL 库提取图像特征形成手绘效果的实例。 使用PIL库获取了图像的轮廓,虽然提取了轮廓,但这个轮廓缺少立体感,视觉效果不够丰满。 光线照射使立体物出现明暗变化,运

    2024年02月06日
    浏览(30)
  • 【Unity实战】Jenkins与自定义命令行参数

    Unity是一款功能强大的游戏开发引擎,它提供了许多方便开发者使用的功能和工具。其中一个非常有用的功能是Unity命令行参数。通过使用命令行参数,开发者可以在启动Unity时自定义一些行为和设置,从而更好地管理和调试项目。 使用Unity命令行参数的好处是,它可以帮助开

    2024年01月19日
    浏览(37)
  • Docker网络配置与自定义IP容器通信

    目录 前言 一、docker网络配置 1. bridge 虚拟网桥 2. host 网络模式 3. none 网络模式 4. 自定义container网络模式 二、自定义IP容器通信 1. 自定义IP 2. 创建所需容器(mysql,tomcat) 3. 准备项目资源 4. 构建Nginx实现负载均衡          当项目大规模使用 Docker 时,容器通信的问题也就

    2024年01月25日
    浏览(46)
  • 【Java SE】判断两个文件内容是否相同的多种方法

    逐字节比较文件内容。这种方法适用于小文件,但对于大文件会比较耗时。 计算文件的哈希值(如 MD5、SHA-256 等),然后比较两个文件的哈希值。如果哈希值相同,则可以认为文件内容相同。这种方法适用于大文件,因为只需要比较哈希值而不是整个文件内容。 通过使用

    2024年02月07日
    浏览(68)
  • TabView 初始化与自定义 TabBar 属性相关

    SWift TabView 与 UIKit 中的 UITabBarController 如出一辙.在 TabView 组件中配置对应的图片和标题; 其中,Tag 用来设置不同 TabView 可动态设置当前可见 Tab;另也有一些常用的属性与 UIKit 中的类似,具体可以按需参考 api 中属性进行单独修改定制; 在 iOS 15.0 之后还可设置角标记 .badge 对 TabBa

    2024年02月10日
    浏览(37)
  • ESP8266连接阿里云(四)与自定义Topic通信

    1)点击产品然后点击Topic列表选择自定义列表,我们可以看到Topic操作权限,发布权限表示我们ESP8266可以向其发布数据,订阅权限表示我们订阅后可以接受到Topic的数据  2)点击自定义Topic类后Topic选择权限,编辑好名称然后写好描述以免Topic过多分不清作用  3)创建成功后将

    2024年02月10日
    浏览(29)
  • 进阶Docker4:网桥模式、主机模式与自定义网络

    目录  网络相关 子网掩码 网关 规则 docke网络配置 bridge模式 host模式 创建自定义网络(自定义IP) IP 子网掩码 网关 DNS 端口号 子网掩码 互联网是由许多小型网络构成的,每个网络上都有许多主机,这样便构成了一个有层次的结构。 IP 地址在设计时就考虑到地址分配的层次特点

    2024年01月19日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包