tomcat为什么要自定义类加载器

66 阅读1分钟

Tomcat 作为 Java Web 服务器,自定义类加载器主要是为了解决以下核心问题:

1. 隔离不同 Web 应用

  • 背景:Tomcat 通常需要同时运行多个 Web 应用,这些应用可能依赖同一类库的不同版本(如 Spring、Hibernate)。若使用默认类加载器,会导致类冲突(ClassPath 污染)。

  • 解决方案

    • 每个 Web 应用拥有独立的 WebAppClassLoader,负责加载自身 /WEB-INF/lib 和 /WEB-INF/classes 下的类。
    • 不同 WebAppClassLoader 相互隔离,同一类库的不同版本可共存于不同应用中。

2. 打破双亲委派模型的局限性

  • 背景

    • 标准的双亲委派模型要求类加载器先委托父加载器加载类,若父加载器无法加载才自己尝试。
    • 但 Web 应用需要优先加载自身的类(如 Servlet 实现),而非全局共享的类。
  • 解决方案

    • WebAppClassLoader 重写了 loadClass() 方法,优先加载自身路径下的类,再委托父加载器(打破双亲委派)。
    • 例如,当 Web 应用自定义了 javax.servlet.Servlet 接口的实现类,会优先加载自身的实现,而非 Tomcat 全局的实现。