1 - Tomcat的类载入器的结构

Tomcat Server在启动的时候将构造一个ClassLoader树,以保证模块的类库是私有的
Tomcat Server的ClassLoader结构如下:

+-----------------------------+|         Bootstrap           ||             |               ||          System             ||             |               ||          Common             ||         /      \            ||     Catalina  Shared        ||               /    \        ||          WebApp1  WebApp2   |+-----------------------------+

其中:
- Bootstrap - 载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar
- System - 载入$CLASSPATH/*.class
- Common - 载入$CATALINA_HOME/common/...,它们对TOMCAT和所有的WEB APP都可见
- Catalina - 载入$CATALINA_HOME/server/...,它们仅对TOMCAT可见,对所有的WEB APP都不可见
- Shared - 载入$CATALINA_HOME/shared/...,它们仅对所有WEB APP可见,对TOMCAT不可见(也不必见)
- WebApp? - 载入ContextBase?/WEB-INF/...,它们仅对该WEB APP可见

2 - ClassLoader的工作原理

每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类
系统默认的contextClassLoader是systemClassLoader,所以一般而言java程序在执行时可以使用JVM自带的类、$JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类
可以使用Thread.currentThread().setContextClassLoader(...);更改当前线程的contextClassLoader,来改变其载入类的行为

ClassLoader被组织成树形,一般的工作原理是:
1) 线程需要用到某个类,于是contextClassLoader被请求来载入该类
2) contextClassLoader请求它的父ClassLoader来完成该载入请求
3) 如果父ClassLoader无法载入类,则contextClassLoader试图自己来载入

注意:WebApp?ClassLoader的工作原理和上述有少许不同:
它先试图自己载入类(在ContextBase?/WEB-INF/...中载入类),如果无法载入,再请求父ClassLoader完成

由此可得:
- 对于WEB APP线程,它的contextClassLoader是WebApp?ClassLoader
- 对于Tomcat Server线程,它的contextClassLoader是CatalinaClassLoader

3 - 部分原代码分析

3.1 - org/apache/catalina/startup/Bootstrap.java

Tomcat Server线程的起点
构造ClassLoader树,并设置Tomcat Server线程的contextClassLoader为catalinaloader
载入若干类,然后转入org.apache.catalina.startup.Catalina类中

[查看代码]

3.2 - org/apache/catalina/startup/ClassLoaderFactory.java

根据设置创建并返回StandardClassLoader的实例

[查看代码]

3.3 - org/apache/catalina/loader/StandardClassLoader.java

类载入器

3.4 - org/apache/catalina/startup/SecurityClassLoad.java

该类仅包含一个静态方法,用来为catalinaLoader载入一些类

[查看代码]

Appendix - 参考

[1] http://jakarta.apache.org/tomcat/中的Tomcat 4.1.x文档Class Loader HOW-TO

转载于:https://www.cnblogs.com/StonySven/p/6713729.html

Tomcat类载入器(转载)相关推荐

  1. java类载入器——ClassLoader

    Java的设计初衷是主要面向嵌入式领域,对于自己定义的一些类,考虑使用依需求载入原则.即在程序使用到时才载入类,节省内存消耗,这时就可以通过类载入器来动态载入. 假设你平时仅仅是做web开发,那应该非 ...

  2. tomcat(8)载入器

    [0]README 0.0)本文部分描述转自"深入剖析tomcat",旨在学习 tomcat(8)载入器 的基础知识: 0.1)一个标准web 应用程序中的载入器:简单来说就是 t ...

  3. 扩展类载入器的载入问题

    我们都知道java的类载入器共同拥有三级,各自是bootstrap (引导类)载入器.extension(扩展类)载入器和 system (系统类)载入器.这三个载入器是父子关系,当中 bootstr ...

  4. java载入器材_JAVA之了解类载入器Classloader

    1.类的载入.连接和初始化 类初始化通常包含载入.连接.初始化三个步骤. (1)进程的结束 每当执行一个java程序时,将会启动一个java虚拟机进程,无论程序多么复杂.有多少线程.都在这个java虚 ...

  5. Jetty 类载入问题处理

    前几日使用 Jetty (9.2)部署公司一个 web 项目,这个项目原本部署在 Tomcat server上,一切正常,可是部署到 Jetty 后,启动报错.关键错误信息为"java.la ...

  6. Tomcat源码分析(十)--部署器 转载

    本系列转载自 http://blog.csdn.net/haitao111313/article/category/1179996 我们知道,在Tomcat的世界里,一个Host容器代表一个虚机器资源 ...

  7. Tomcat - 深度学习 - 类加器详解

    前言 Tomcat如何实现不同的应用程序,使用不同的第三方类库?带着疑问学下去 打破双亲委派 以Tomcat类加载为例,Tomcat 如果使用默认的双亲委派类加载机制行不行? 我们思考一下: Tomc ...

  8. Tomcat的类加载器

    看完了Java类装载器,我们再来看看应用服务器(Tomcat)对类加载器的使用,每个应用服务器都有一套自己的类加载器体系,从而与Java的类加载器区别开以达到自己与应用程序隔离的目的.Tomcat的类 ...

  9. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过 ...

最新文章

  1. trigger() --工作中问题nav样式
  2. 限定项目的 Node.js 版本
  3. android stadio mapping文件的使用
  4. cdh的hive配置文件位置_CDH6配置 Atlas,及 Hive Hook
  5. 数据库索引数据结构总结——ART树就是前缀树
  6. 利用GoogleEarth影像打造Skyline MPT案例(转载)
  7. Tomcat的安装配置与JavaWeb入门教程
  8. 【话题】产品经理如何排期rd任务,才能更好控制产品节奏
  9. SPOJ3276 D-query
  10. 嵌入式系统功能需求分析_机械管理系统如何物料需求分析
  11. 网络虚拟化叠加的八个用例
  12. SQL优化之存储过程强制编译
  13. SolidWorks工程图导出PDF时出现“Arial Unicode MS”字体不存在时,解决方案
  14. 联想 yoga213笔记本,无线网卡无法打开-“硬件无线网络关闭无法打开 ‘问题解决方法。Intel 7260AC NGW NGFF接口网卡,蓝牙WIFI模块...
  15. 2021上半年软考中级软件设计师考试心得(10天时间你可以拿捏的)
  16. STM32F207通过FSMC读取ADC数据
  17. win7计算机窗口无法最小化,Windows7系统任务栏不显示最小化窗口的解决方法
  18. 魔兽世界地图插件制作代码
  19. 重庆大学计算机学院专硕分析,重庆大学电子信息(专硕)专业考研难度分析-专业排名-难度大小...
  20. 银行核心系统之存款业务(一)

热门文章

  1. 个人觉得非常好用的mysql客户端工具的HeidiSQL
  2. 解决content is not allowed in prolog问题
  3. 新发现的两个Delphi要点。
  4. 新闻更新延时引发的学习,CACHE的利用。
  5. java线程池 的方法_JAVA线程池的实现方法
  6. ElasticSearch的中文分词
  7. (90)AXI突发式读写时序和过程
  8. (27)Verilog HDL循环语句:while
  9. FPGA外挂DDR存储器简介
  10. 计算机系统中的总线,计算机系统中的总线控制器及其方法