Tomcat 作为 Java Web 服务器,自定义类加载器主要是为了解决以下核心问题:
1. 隔离不同 Web 应用
-
背景:Tomcat 通常需要同时运行多个 Web 应用,这些应用可能依赖同一类库的不同版本(如 Spring、Hibernate)。若使用默认类加载器,会导致类冲突(ClassPath 污染)。
-
解决方案:
- 每个 Web 应用拥有独立的 WebAppClassLoader,负责加载自身
/WEB-INF/lib和/WEB-INF/classes下的类。 - 不同 WebAppClassLoader 相互隔离,同一类库的不同版本可共存于不同应用中。
- 每个 Web 应用拥有独立的 WebAppClassLoader,负责加载自身
2. 打破双亲委派模型的局限性
-
背景:
- 标准的双亲委派模型要求类加载器先委托父加载器加载类,若父加载器无法加载才自己尝试。
- 但 Web 应用需要优先加载自身的类(如 Servlet 实现),而非全局共享的类。
-
解决方案:
- WebAppClassLoader 重写了
loadClass()方法,优先加载自身路径下的类,再委托父加载器(打破双亲委派)。 - 例如,当 Web 应用自定义了
javax.servlet.Servlet接口的实现类,会优先加载自身的实现,而非 Tomcat 全局的实现。
- WebAppClassLoader 重写了