下文笔者讲述Tomcat类加载简介说明,如下所示
Tomcat整体的类加载图
Common类加载器: 负责加载Tomcat和Web应用的通用类 Catalina类加载器: 负责加载Tomcat专用的类,而这些被加载的类在Web应用中将不可见 Shared类加载器: 负责加载Tomcat下所有的Web应用程序的类,而这些被加载的类在Tomcat容器将不可见 WebApp类加载器: 负责加载具体的某个Web应用程序的类,而这些被加载的类在Tomcat和其他的Web应用程序都将不可见 Jsp类加载器: 每个jsp页面一个类加载器,不同的jsp页面有不同的类加载器,方便实现jsp页面的热插拔
双亲委派模型
当收到一个类加载的请求 本身不会先加载此类 而是会先将此请求委派给父类加载器去完成 每个层次都是如此 直到启动类加载器中 只有父类都没有加载此文件 那么子类才会尝试自己去加载
双亲委派模型优点
保证核心类库不被覆盖 如果没有使用双亲委派模型 由各个类加载器自行加载的话 如果用户自己编写了一个称为java.lang.Object的类 并放在程序的ClassPath中,那系统将会出现多个不同的Object类 Java类型体系中最基础的行为就无法保证。应用程序也将会变得一片混乱。
Tomcat为什么要自定义类加载器
隔离不同应用: 部署在同一个Tomcat中的不同应用A和B 例: A用Spring2.5 B用Spring3.5 此时两个应用如果使用的是同一个类加载器 则Web应用就会因为jar包覆盖而无法启动 隔离服务器与不同应用: 服务器需要尽可能地保证自身的安全不受部署的Web应用程序影响 所以服务器所使用的类库应该与应用程序的类库互相独立。 性能: 部署在同一服务上两个Web应用程序所使用的Java类库可以互相共享 Tomcat使用自定义类加载器的优点: Tomcat自定义WebAppClassLoader类加载器 打破双亲委派的机制 即如果收到类加载的请求,会尝试自己去加载, 如果找不到再交给父加载器去加载, 目的就是为了优先加载Web应用自己定义的类。 ClassLoader默认的loadClass方法是以双亲委派的模型进行加载类的, 则Tomcat既然要打破这个规则,就要重写loadClass方法, 我们可以看WebAppClassLoader类中重写的loadClass方法
Web应用默认类加载顺序(打破双亲委派规则)
从本地缓存中查找是否加载过此类 如果已经加载即返回 否则继续下一步 检查JVM缓存中是否已经加载 防止Web应用覆盖JRE核心类 从AppClassLoader中查找是否加载过此类 如果加载到即返回 否则继续下一步。 判断是否设置delegate属性 如果设置为true,则按照双亲委派机制加载类 默认是设置delegate是false, 那么就会先用WebAppClassLoader进行加载 如果此时在WebAppClassLoader没找到类, 那么就委托父类加载器(Common ClassLoader)去加载
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。