下文笔者讲述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)去加载
									
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

 
			 
                
                
                
               
 
          

