Tomcat正统类加载器架构

来源:互联网 发布:c语言每行输出5个 编辑:程序博客网 时间:2024/06/08 13:07

1、Web服务器要解决的几个问题
(1)部署在同一个服务器上面的不同的Web应用程序所使用的Java类库可以实现相互隔离。
(2)部署在同一个服务器上面的不同的Web应用程序所使用的Java类库可以互相共享。
(3)服务器需要尽可能地保证自身的安全不受部署的Web应用程序影响。
(4)支持JSP应用的Web服务器,大多数都需要支持HotSwap功能。

2.Tomcat5类加载器结构
这里写图片描述

Tomcat5中存放Java类库的目录:
(1)/common:类库可被Tomcat和所有的Web应用程序共同使用。
(2)/server:类库可被Tomcat使用,对所有的Web应用程序都不可以。
(3)/shared:类库可被所有的Web应用程序共同使用,但对Tomcat自己不可见。
(4)/WebApp/WEB-INF:类库仅仅被此Web应用程序使用,对Tomcat和其他Web应用程序都不可见。

3.Tomcat6类加载器结构
这里写图片描述

Tomcat6中存放Java类库的目录:
(1)/lib:把/common、/server、/shared三个目录默认合并到一起变成一个/lib目录,类库可被Tomcat和所有的Web应用程序共同使用。
(2)/WebApp/WEB-INF:类库仅仅被此Web应用程序使用,对Tomcat和其他Web应用程序都不可见。

在Tomcat6中,可以通过指定Tomcat安装目的/conf/catalina.properties属性文件中的server.loader和share.loader建立和Tomcat5类似的ServerClassLoader和SharedClassLoader。

4.问题
如果有10个Web应用程序都是用spring来进行组织和管理的话,Spring要对用户程序的类进行管理,自然要能访问到用户程序的类,而用户的程序”显然是放在/WebApp/WEB-INF目录中的,那么被CommonClassLoader或 SharedClassLoader加载的Spring如何访问并不在其加载范围内的用户程序呢?
结论:spring加载应用程序类的时候,首先使用线程上下文绑定的类加载器,获取到直接返回;否则获取加载spring的类加载器,获取到直接返回;否则返回系统类加载器。spring从设计之初就考虑到了,不同应用间上下文隔离以及webApp共享问题,采用的就是线程上下文类加载器绑定方式,tomcat启动后,为每个webApp创建一个webAppClassLoarder作为应用间隔离的类加载器,同时也将该类加载器绑定到启动webApp的线程上,故而spring总是能获取到加载对应 应用程序的对应类加载器

0 0