Tomcat类加载

乔欣 Java面经 发布时间:2022-11-15 17:40:07 阅读数:18090 1 中间件
下文笔者讲述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)去加载
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaMianJing/202211/16685053344919.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者