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文件就可以了!!!