本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
tomcat类加载机制(违反双亲委派机制)
- commonLoader:Tomcat最基本的类加载器,加载路径中的class可以被Tomcat容器本身以及各个Webapp访问;
- catalinaLoader:Tomcat容器私有的类加载器,加载路径中的class对于Webapp不可见;
- sharedLoader:各个Webapp共享的类加载器,加载路径中的class对于所有Webapp可见,但是对于Tomcat容器不可见;
- WebappClassLoader:各个Webapp私有的类加载器,加载路径中的class只对当前Webapp可见;
为什么说tomcat违背了双亲委派机制?
tomcat的类加载机制中,对于一些非基础类(Object,String等),都是由web类加载器优先加载,加载不到,才会让common类加载器走双亲委派机制加载。
这一点就是违背了双亲委派机制。双亲委派机制,就是不管自己是否能加载,首先让父加载器先加载,父加载器加载不到才会让子类加载器加载。
tomcat违背双亲委派机制的原因是什么?
因为一个tomcat是可以部署多个应用的,每一个应用中的类可能都不一样,也有可能是相同接口,不同实现。这个时候如果走双亲委派机制,那么两个APP的加载的类就会一样。会出现各种问题。因此,tomcat通过调整类加载器的顺序,来保证各个应用之间类的隔离。
tomcat中一个父类加载器如何加载web类加载器中的类?
前面说了web类加载器会优先自己加载指定目录下的类,如果父类要加载子类加载器中的类,可以直接走线程上下文加载器,通过这个可以直接指定加载器加载,这样就解决了这个问题。
其实有很多都是违背了双亲委派机制,还有JDBC也是,JDBC是基于Java中的SPI机制,JDK的类加载器,只能加载自己 包下的类。但是SPI的实现类一般都是第三方包。这个时候要使用线程上下文中的指定加载器加载。