学习Tomcat
Servlet规范定义的类加载顺序 在Servlet规范中有对web应用程序类的加载方式作出建议,重要的有两点: 容器要加载某个类时,类加载器首先应该加载本地web应用程序中“WEB-INF/classes”路径中的类,然后再到“WEB-INF/lib”依赖库中加载类,最后在容器级别的lib中加载类; 同时,类加载器要保证应用程序不会覆盖Java核心类,即 java.* 和 javax.* 命名空间中的类,也就是说web应用程序如果定义了一个和java核心类名字相同的类则是无效的。 Tomcat的应用程序类加载器 Tomcat内部有多种类型的类加载器,其中 WebappClassLoader 是应用程序类加载器,tomcat启动时对于它管理的每个web应用程序都会创建一个单独 WebappClassLoader 实例,在tomcat内部的 StandardContex 类中的启动方法中找到。 根据servlet规范,容器要首先在本地应用程序库中加载请求的类,同时要避免应用程序中的类覆盖Java平台类库中的核心类, WebappClassLoader 加载器为了实现这些要求没有遵循java的父加载器委托的模型,它重写了ClassLoader的 loadClass 方法,重写的 loadClass 方法的源代码细节如下: // 代码省略了一些与类加载逻辑关系不大的细节