Tomcat内核之Tomcat的类加载器

简介: 跟其他主流的Java Web服务器一样,Tomcat也拥有不同的自定义类加载器,达到对各种资源库的控制。一般来说,Java Web服务器需要解决以下四个问题:①   同一个Web服务器里,各个Web项目之间各自使用的Java类库要互相隔离。

跟其他主流的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支持热替换功能。


点击订购作者《Tomcat内核设计剖析》



目录
相关文章
|
8月前
|
Java 应用服务中间件
《深入理解java虚拟机》——Tomcat类加载器体系结构
《深入理解java虚拟机》——Tomcat类加载器体系结构
|
10月前
|
存储 Java 应用服务中间件
|
Java 应用服务中间件 C++
自定义类加载器实现及在tomcat中的应用
自定义类加载器实现及在tomcat中的应用
251 0
自定义类加载器实现及在tomcat中的应用
|
XML 存储 前端开发
Tomcat 7 类加载器是如何实现的
与许多服务器应用程序一样,Tomcat安装了各种类加载器(即实现的类java.lang.ClassLoader),以允许容器的不同部分和容器上运行的Web应用程序访问可用类和资源的不同存储库。此机制用于提供Servlet规范2.4版中定义的功能 - 特别是9.4和9.6节。
105 0
|
前端开发 安全 Java
Tomcat 类加载器
开篇  这是一篇尝试讲解清楚Tomcat的类加载器的文章,估摸着能讲清楚六成左右,待后续再理理思路。  文末有彩蛋,可以直接翻到文章末尾。 Tomcat 类加载器概览 说明: BootstrapClassLoader : 系统类加载器,加载%JAVA_HOME%/lib目录下的jar Ext.
1336 0
|
Web App开发 应用服务中间件
谈谈Tomcat内核
========广告时间======== 鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。
938 0
|
应用服务中间件
《Tomcat内核设计剖析》京东评论过百
到京东看了下《Tomcat内核设计剖析》评论都一百多了,上个月也第二次印刷了,这里看下好评、中评和差评。
1043 0
|
应用服务中间件
《Tomcat内核设计剖析》勘误表
《Tomcat内核设计剖析》勘误表 书中第95页图request部分印成了reqiest。
909 0
|
应用服务中间件
新书预售《Tomcat内核设计剖析》
鄙人的新书《Tomcat内核设计剖析》已经在京东预售了,有需要的朋友可以通过文末的连接进行预定。
1079 0
|
应用服务中间件
Tomcat内核之ASCII解码的表驱动模式
我们知道Tomcat通信是建立在Socket的基础上,而套接字在服务器端和客户端传递的报文都是未经过编码的字节流,每8位组成1个字节,计算机以二进制为基础,这是由于使用晶体管的开合状态表示1和0,这样8个电晶体管就可以组成一个字节,这正是应用层使用的最小单位——字节。
1203 0