Tomcat自定义加载器详解
tomcat的几个主要类加载器:
1、CommonClassLoader:tomcat最基本的类加载器,记载路径中的class可以被tomcat容器本身以及各个Webapp访问;
2、CatalinaClassLoder:Tomcat容器私有的类加载器,加载路径中的class对于Webapp不可见;
3、SharedClassLoader:各个Webapp共享的类加载器,加载类路径下的class对于所有的Webapp可见,但是对于Tomcat容器不可见;
4、WebappClassLoader:各个Webapp私有的类加载器,加载类路径下的class只对当前Webapp可见,比如加载war包里相关的类,每个war包应用都有自己的WebappClassLoader,实现相互隔离,比如不同的war包引入了不同版本的mybatis版本,这样实现各个Webapp能加载各自的mybatis版本;
tomcat类加载器委派关系图如下:
从图中的委派关系中可以看出:
1).CommonClassLoader能加载的类都可以被CatalinaClassLoader和SharedClassLoader使用,从而实现了公有类库的共用。
2).CatalinaClassLoader和SharedClassLoader自己能加载的类则与对方相互隔离。
3).WebAppClassLoader可以使用SharedClassLoader加载到的类,但各个WebAppClassLoader实例之间相互隔离。
4).JasperLoader的加载范围仅仅是这个JSP文件所编译出来的那一个.Class文件,它出现的目的就是为了被丢弃:当Web容器检测到JSP文件被修改时,会替换掉目前的JasperLoader的实例,并通过再建立一个新的Jsp类加载器来实现JSP文件的热加载功能。
Tomcat为了实现隔离性设计了这种类加载器委派关系,直接打破了java 推荐的双亲委派模型。每个webappClassLoader加载自己的目录下的class文件,不会传递给父类加载器,打破了双亲委派机制。