Tomcat的WebappClassLoader的线程绑定和刷新

tomcat的里面有几种classLoader,最有意思的就是WebAppClassLoader了,这种classLoader只能够加载其所关联的web应用下的类和父加载器所能够加载的类。

 虽然这个人所共知,但为了达到能够让一个线程加载其所在context的类,那么就需要能够随时切换这个线程的类加载器。

 所以,当请求到来的时候,要做好环境的准备,切换好处理这个请求的线程的类加载器,做好准备之后,执行Servlet的里面的代码的时候,代码能够加载的类,就只能是这个context的类了。

 请求处理完成之后,估计又要还原回原来的类加载器了,这样,每次请求都切换,处理完就还原。其实跟shiro的subject的切换是类似的。

 这里直接作用于线程,而shiro是使用ThreadLocal来实现。有时间具体分析一下代码,理清楚具体的逻辑和实现方式,这个原理还是值得我们借鉴和学习的。

 

StandardContext 代表一个目录或一个war的应用,关键是应用。

为了实现类加载器,把war包会解压缩成目录,名称跟war包同名,此时,创建一个WebResourceRoot,这个代表的就是这个目录。

其实,创建一个Context,就实际创建了一个WebappClassLoader了,然后,将其关联的context放入其中,这样就能访问到webResourcesRoot了,那么,当一个类被加载时

就会先寻找/WEB-INF/classes目录下面的class看是否存在需要加载的类,如果没有找到,就去找/WEB-INF/lib目录下面的class文件,如果找不到,那么就到系统类加载器下面找了。

为了实现web应用的类的隔离,运用类加载器来引导对类类的加载,这里的引导,就是自己实现一个webappClassLoader,然后当要加载的时候,在指定的一些目录搜索class文件就可以了!!!

 

转载于:https://www.cnblogs.com/weiguangyue/p/10004773.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值