参考链接
https://blog.csdn.net/qq_33589510/article/details/119195107
Tomcat 类加载机制
tomcat 类加载结构图
- CommonsLoader,CatalinaClassLoader, SharedClassLoader 这三个不是类,而是加载器的实例名称,可以在 Tomcat 的 Bootstrap 类的源码中看到
- 三个类加载器加载的位置可以看到是通过 createClassLoader 方法中 CatalinaProperties.getProperty(name + “.loader”) 去获取的,也就是下面 TOMCAT_HOME/conf/catalina.properties 文件中配置的
shared.loader 和 server.loader 默认情况下配置的都是为空,所以在默认情况下其实 CommonsLoader,CatalinaClassLoader, SharedClassLoader 这三个类加载器都是同一个。
Tomcat 为什么要破坏双亲委派呢机制
- 若在Tomcat运行两个Web应用程序,它们有功能不同的同名Servlet,Tomcat需同时加载和管理这两个同名的Servlet类,保证它们不会冲突。所以Web应用之间的类需要隔离
- 若两个Web应用都依赖同一三方jar,比如Spring,则Spring jar被加载到内存后,Tomcat要保证这两个Web应用能共享之,即Spring jar只被加载一次,否则随着三方jar增多,JVM的内存会占用过大。所以,和 JVM 一样,需要隔离Tomcat本身的类和Web应用的类。
Tomcat 是如何破坏双亲委派机制的
双亲委派机制代码的实现
java 中双亲委派机制是在 ClassLoader 类的 loadClass 方法去实现的。
对于Tomcat 的自定义类加载器 WebAppClassLoader ,重写了 loadClass 和 findClass 方法。因为 双亲委派机制是在 ClassLoader 的 loadClass 方法中进行保证的,而 WebAppClassLoader 重写的 loadClass 方法中并没有调用 ClassLoader 的 loadClass 方法,而是自己进行了重写,正是通过这种方式打破双亲委派机制。