Tomcat 如何破坏双亲委派机制的?
一、先说说Tomcat为什么要破坏双亲委派模型?
事实上,在Tomcat中是可以存放多个war项目的,可以运行多个war项目的,但是为什么可以同时运行多个war项目,其实这个和打破双亲委派模型有关系,因为在多个war项目中难免会出现相同的类名,但是有不同的功能,如果Tomcat没有打破双亲委派模型的话,就会出现将把所有的类都交给BootStraptClassLoader那么就不能存在多个war项目了,所以这是一个破坏双亲委派模型的原因。
二、那Tomcat是如何破坏双亲委派模型的呢?
首先,先看图:
会发现在整个双亲委派模型的结构中,添加了两部分:
第一部分:主要的作用是加载Tomcat包中的类,这里依然采用的是双亲委派模型。
第二部分:主要的作用是打破双亲委派模型。
首先说第一部分:这部分的类加载器,哎tomcat7及其以前是tomcat自定义的三个类加载器,到了tomcat8及其以后,tomcat就将这三个文件合并到了一个lib目录。
了解这三个部分的类加载器:
commonClassLoader:tomcat最基本的类加载器,加载路径中的class可以被tomcat容器本身和各个webapp访问。
CatalinaClassLoader:tomcat容器私有的类加载器,加载路径中的class对于webapp不可见。
sharedClassLoader:sharedClassLoader是各个webapps共享的类加载器,加载路径中的class对于所有的webapp都是可见的,但是对于tomcat容器是不可见的。
这一部分类加载器,依然采用的是双亲委派机制,原因是,它只有一份,即使有重复,也是用这一份为准。
第二部分:这部分的类加载器就是用于打破双亲委派模型的类加载器。
webappClassLoader类加载器:项目在打war包的时候, tomcat自动生成的类加载器, 也就是说 , 每一个项目打成一个war包, tomcat都会自动生成一个类加载器, 专门用来加载这个war包. 而这个类加载器打破了双亲委派机制。