tomcat类加载机制

1.Tomcat 类加载器架构

Tomcat 服务器类加载要解决的问题:
1.同一个 tomcat 服务器下的不同应用所使用的类库可以实现隔离.
2.同一个 toncat 服务器下的不同应用所使用的类库可以互相共享.
3.服务器需要尽可能保证自身的安全不受部署的 web 应用程序影响(服务器使用到的类库应当和应用程序使用到的类库互相隔离).

在 Tomcat 目录结构中,有 3 组目录:/common/* /server/* /shared/* /WEB-INF/* 可以存放 java 类库.

/common/* 类库可被 tomcat 和所有引用程序共同使用
/server/* 类库可被 tomcat 使用,多所有的 web应用程序不可见
/shared/* 类库可被所有的 web 应用程序共同使用,但对 tomcat 自己不可见
/webapp/web-inf/ 类库仅仅可以被此 web 应用程序使用,对 tomcat 和其他web应用程序都不可见.

在这里插入图片描述

common classloader 加载 common 目录
catalina classloader 加载 server 目录
shared classloader 加载 shared 目录
webapp classloader 加载 web-inf
jsperLoader 加载 jsp 文件

在 Tomcat6.x 版本中,只有指定了 tomcat/conf/catalina.properties 配置文件的 server.loader 和 share.loader 项后才会真正建立 CatalinaClassLoader 和 SharedClassLoader 的实例,否则会用到这两个类加载器的地方都会用 CommonClassLoader 的实例代替. 而默认配置文件中没有设置这两个 loader 项,所以 Tomcat6.x 顺理成章的把 /common、/server 和 .shared 三个目录合并成了一个 /lib 目录.——相当于加载 /common 目录.

现在思考这么一个问题:如果有 10个应用程序都是用 Spring 来管理的,那么我们可以把 Spring 的基础包放到 common 或者shared 目录下让应用程序共享. Spring 要对用户程序进行管理,那么自然要访问到用户程序的类,而用户程序显然放在 /web-info 目录下,那么 CommonClassLoader 或 SharedClassLoader 如何访问不在其加载范围内的用户程序了?

答案是线程上下文类加载器.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值