tomcat打破双亲委派机制

参考文章:
https://time.geekbang.org/column/article/95808
https://time.geekbang.org/column/article/105711
在这里插入图片描述
WebAppClassLoader,
tomcat可以部署多个web应用,确保不同的web同名的servlet都能被加载。在context 实例化的时候创建。
SharedClassLoader
不同的web共用同样的jar,只加载一次。
CatalinaClassLoader
隔离tomcat类和web应用类
CommonClassLoader
tomcat和web应用类共享一些jar或者类。
可以在Tomcat conf目录下的Catalina.properties文件里配置各种类加载器的加载路径

每个 Web 应用自己的 Java 类文件和依赖的 JAR 包,分别放在WEB-INF/classes和WEB-INF/lib目录下面。多个应用共享的 Java 类文件和 JAR 包,分别放在 Web 容器指定的共享目录下。当出现 ClassNotFound 错误时,应该检查你的类加载器是否正确。

web目录结构

在这里插入图片描述

  • /bin:存放 Windows 或 Linux 平台上启动和关闭 Tomcat 的脚本文件。
  • /conf:存放 Tomcat 的各种全局配置文件,其中最重要的是server.xml。
  • /lib:存放 Tomcat 以及所有 Web 应用都可以访问的 JAR 文件。
  • /logs:存放 Tomcat 执行时产生的日志文件。
  • /work:存放 JSP 编译后产生的 Class 文件。
  • /webapps:Tomcat 的 Web 应用目录,默认情况下把 Web 应用放在这个目录下。

web打破双亲委派机制

WebAppClassLoader重写loadClass方法。

线程上下文加载器

问题:spring作为第三方jar包被SharedClassLoader加载器加载,但是jvm默认的实现是默认情况下,如果一个类由类加载器 A 加载,那么这个类的依赖类也是由相同的类加载器加载。这样业务类就会被SharedClassLoader加载,但是业务类不在SharedClassLoader指定的目录下,是在web应用目录下? 那怎么解决这个问题?
答案:线程上下文加载器。这个线程保存在私有数据里,只要是同一个线程,一旦设置了线程上线文加载器,后续就可以把这个加载器取出来。tomcat在为每个web应用创建WebAppClassLoader时,并在启动web应用的线程里设置线程上下文加载器。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值