跟其他主流的Java Web服务器一样,Tomcat也拥有不同的自定义类加载器,达到对各种资源库的控制。一般来说,Java Web服务器需要解决以下四个问题:

①   同一个Web服务器里,各个Web项目之间各自使用的Java类库要互相隔离。

②   同一个Web服务器里,各个Web项目之间可以提供共享的Java类库。

③   服务器为了不受Web项目的影响,应该使服务器的类库与应用程序的类库互相独立。

④   对于支持JSP的Web服务器,应该支持热插拔(hotswap)功能。

对于以上几个问题,如果单独使用一个类加载器明显是达不到效果的,必须根据实际使用若干个自定义类加载器。

下面以本书主要剖析的Tomcat7为例,看看它的类加载器是怎样定义的?如图2-4-3,启动类加载器、扩展类加载器、应用程序类加载器这三个类加载器数据JDK级别的加载器,他们是唯一的,我们一般不会对其做任何更改。接下来则是Tomcat的类加载器,在tomcat7中,最重要的一个类加载器是Common ClassLoader,它的父类加载器是ApplicationClassLoader,负责加载 $CATALINA_BASE/lib、  $CATALINA_HOME/lib两个目录下所有的.class跟.jar文件。而下面虚线框的两个类加载器有必要说明一下,如果在Tomcat5版本,这两个类加载器实例默认与Common
ClassLoader实例不同,Common ClassLoader为他们的父类加载器。而在Tomcat7中,这两个实例变量也存在,只是catalina.properties配置文件没有对server.loader跟share.loader两项进行配置,所以在程序里,这两个类加载器实例就被赋值为CommonClassLoader实例,即一个tomcat实例其实就只有CommonClassLoader实例。如以下代码

private
void
initClassLoaders() {

try {

commonLoader = createClassLoader("common",null);

if(commonLoader ==
null ) {

commonLoader=this.getClass().getClassLoader();

}

catalinaLoader = createClassLoader("server",commonLoader);

sharedLoader = createClassLoader("shared",commonLoader);

} catch (Throwable t) {

handleThrowable(t);

log.error("Class loader creation threwexception", t);

System.exit(1);

}

}

首先创建一个commonLoader,再把commonLoader作为参数传进createClassLoader方法里,在这个方法里面会根据catalina.properties中的server.loader和share.loader属性是否为空进行判断是否另外创建新的类加载器,如果属性为空则把commonLoader直接赋值给catalinaLoader和sharedLoader。如果默认配置满足不了你的需求,可以通过修改catalina.properties配置文件满足需要。WebAppClassLoader从名字来看就大概知道主要用于加载Web应用程序的,它的父类加载器是Common
ClassLoader,一般有多个WebApp类加载器实例,每个类加载器加载一个Web程序,加载路径为/WebApp/WEB-INF目录。最后,JSP ClassLoader则是负责加载jsp文件编译出来的class,WebApp ClassLoader为它的父类加载器,当Tomcat检测到jsp文件有改动时,会创建一个新的JSP ClassLoader并替换掉当前的JSP ClassLassLoader,对/WebApp/WEB-INF目录下的JSP进行加载。

图2-4-3 Tomcat7类加载器

对照这样的一个类加载器结构,看看上面Java Web服务器需要解决的问题是否解决。由于每个Web应用项目都有自己的WebApp ClassLoader,很好地使多个Web应用程序之间互相隔离;并且能有效使Tomcat不受Web应用程序影响;Common ClassLoader的存在使多个Web应用程序能够互相共享类库;而每一个JSP文件对应一个Jsp ClassLoader则可以使Tomcat支持热替换功能。

喜欢研究java的同学可以交个朋友,下面是本人的微信号:

Tomcat内核之Tomcat的类加载器的更多相关文章

  1. 学习Tomcat(六)之类加载器

    通过前面的文章我们知道,Tomcat的请求最终都会交给用户配置的servlet实例来处理.Servlet类是配置在配置文件中的,这就需要类加载器对Servlet类进行加载.Tomcat容器自定义了类加 ...

  2. Tomcat的类加载器

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

  3. tomcat 7 中的类加载器学习

    tomcat 7自带很多junit测试用例,可以帮助我们窥探源码的秘密.以下使用来测试类加载器的一个测试用例.类加载器也是对象,他们用来将类从类从.class文件加载到虚拟机,这些已经讲了很多,深入j ...

  4. 简单了解Tomcat与OSGi的类加载器架构

    前言: 本次博客主要是对Tomcat与OSGi的类加载器架构,所以就需要对tomcat.OSGi以及类加载机制有所了解 类加载可以在http://www.cnblogs.com/ghoster/p/7 ...

  5. Java类加载机制与Tomcat类加载器架构

    Java类加载机制 类加载器 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这 ...

  6. Tomcat源码分析 (五)----- Tomcat 类加载器

    在研究tomcat 类加载之前,我们复习一下或者说巩固一下java 默认的类加载器.楼主以前对类加载也是懵懵懂懂,借此机会,也好好复习一下. 楼主翻开了神书<深入理解Java虚拟机>第二版 ...

  7. 深入理解JVM虚拟机7:JNDI,OSGI,Tomcat类加载器实现

    打破双亲委派模型 JNDI JNDI 的理解   JNDI是 Java 命名与文件夹接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之中的一 ...

  8. 类加载器在Tomcat中的应用

    之前有文章已经介绍过了JVM中的类加载机制,JVM中通过类加载加载class文件,通过双亲委派模型完成分层加载.实际上类加载机制并不仅仅是在JVM中得以运用,通过影响字节码生成和类加载器目前已经有了许 ...

  9. Tomcat源码分析(类加载与类加载器)

    Tomcat的挑战 Tomcat上可以部署多个项目 Tomcat的一般部署,可以通过多种方式启动一个Tomcat部署多个项目,那么Tomcat在设计时会遇到什么挑战呢? Tomcat运行时需要加载哪些 ...

随机推荐

  1. bzoj 3277: 串

    Description 字符串是oi界常考的问题.现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中 至少k个字符串的子串(注意包括本身). Solution 出现 \(k ...

  2. ●HDU 2871 Memory Control(Splay)

    ●赘述题目 四种操作: ○Reset:将整个内存序列清空. ○New a:在尽量靠左的位置新建一个长度为a的内存块,并输出改内存块起始位置.(各个内存块即使相邻也不会合并..) ○Free a:将a点 ...

  3. ●BZOJ 2007 NOI 2010 海拔

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2007 题解: 网络流.最小割.对偶图 奇妙的题 ~ 种种原因导致了高度要么为 0,要么为 1 ...

  4. POJ 3294 n个串中至少一半的串共享的最长公共子串

    Life Forms Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 12484   Accepted: 3502 Descr ...

  5. 习题9-6 uva 10723

    题意: 给你两个字符串,求一个最短的串,使得输入的两个串均是他的子序列(不一定连续) 思路: 可以看出ans = 两个串的长度和 - 两个串的最长公共子序列,在最后的构造处GG.  在构造时想了很久, ...

  6. Codeforces Round #398 (div.2)简要题解

    这场cf时间特别好,周六下午,于是就打了打(谁叫我永远1800上不去div1) 比以前div2的题目更均衡了,没有太简单和太难的...好像B题难度高了很多,然后卡了很多人. 然后我最后做了四题,E题感 ...

  7. 最近i学习微信卡券中的会员卡功能,弄清楚不容易 ,分享一下。

    创建会员卡接口 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025283 [4.1 创建会员卡接口] { " ...

  8. VC++ 6.0中添加库文件和头文件

    附加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools>Options>Directories>Include files. 对于特定项目的头文件包含,在& ...

  9. Echarts 地图添加自定义区域

    使用 Echarts 生成地图时,如果需要添加一些自定义区域,该怎么做呢?请看下面示例. 生成原始地图 index.hmtl 引入 Jquery 和 Echart <!DOCTYPE html& ...

  10. Weblogic Exception in AppMerge flows' progression

    原因:经过分析是web.xml配置的问题,有些servlet上面配置了'display-name',这个weblogic是不支持的. 解决:在web.xml中把'display-name'删除掉,工程 ...