tomcat:tomcat类加载架构

tomcat能不能使用默认的类加载机制?为什么?

在看这个问题之前,首先来明确tomcat作为一个web容器,到底需要解决哪些问题?
1、应用隔离。
一个tomcat容器可能同时运行多个应用程序,每个应用程序可能会依赖到同一个三方包的不同版本,因此不能要求同一个类在整个tomcat容器只存在一份,需要保证他们的类库互相隔离开。
2、共享资源。
上面说到一个tomcat可能运行多个应用程序,每个程序可能依赖到同一个三方包的相同版本。同理,每个应用程序也可能依赖到一样的类,如果此时需要在tomcat中维护多个相同的类,无疑是资源的浪费。因此要求在应用隔离的基础上还要实现一定的资源共享。
3、安全隔离
一个web容器有自己依赖的类库。出于安全考虑,要求web容器的类库与应用程序的类库互相隔离。
4、支持jsp修改
一个web容器要求支持jsp的修改。jsp编译后在虚拟机里就是class,因web容器需要支持jsp修改后不重启容器。

现在已经知道了tomcat作为一个web容器需要解决的问题,那么再回到原先的问题,tomcat能不能使用默认的类加载器?
1、应用隔离。
不支持。默认的类加载器使用双亲委派机制,同个类在java虚拟机中只存在一份,无法隔离两个版本的类库。
2、共享资源
支持。理由如上
3、安全隔离
不支持。理由桶应用隔离
4、支持jsp修改
不支持。loadClass的时候,如果已经有这个class,不再去读取二进制流加载,所以无法加载修改的jsp文件。【tomcat支持jsp热修改的实现方式:每个jsp对应一个jsp类加载器,当jsp修改后,卸载原来的类加载器,重新创建类加载器重新加载jsp文件】

tomcat 如何实现其独有的类加载机制?

既然tomcat不能使用默认的类加载机制,那么tomcat是怎么实现他独有的类加载机制呢?
下面先来看下tomcat的类加载结构图
在这里插入图片描述

如上图所示:
1、最上面三个是JVM默认的三个加载器,其他的都是tomcat中的加载器
2、common 类加载器,加载common文件夹下的类,tomcat容器与所有应用程序共享
3、catalina 类加载器 ,加载server文件夹下的类,tomcat容器私有
4、shared 类加载器 ,所有应用程序共享
5、WebApp类加载器,每个应用程序一个加载器,应用程序私有
6、Jsp类加载器,每个jsp文件一个加载器,jsp修改后,就会卸载他的原类加载器,并创建新的类加载器加载jsp文件所编译得到的class。

为何说tomcat违背了双亲委派机制?

通过 上面的分析可知,tomcat可以实现资源共享、安全隔离(容器与应用隔离),jsp热修改,那么如果实现了应用隔离呢。
WebApp类加载器会加载自己WEB-INF下的类,不会委派给父加载器,以此来实现应用隔离。
所以说tomcat是违背双亲委派的。

扩展问题,如果common classloader想要加载WebApp class loader中的类,怎么办?

线程上下文类加载器
父加载器通过线程上下文类加载器请求子类加载加载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值