问答题690/1053Tomcat是怎么打破双亲委派机制的呢?

难度:
2021-11-02 创建

参考答案:

在 Tomcat 中,打破了传统的 双亲委派机制,通过实现自定义的 ClassLoader 来实现对类加载的控制。Tomcat 通过为每个 Web 应用程序创建一个独立的类加载器,使得 Web 应用程序可以加载自己的类,而不一定要委派给系统的类加载器或父类加载器。

传统双亲委派机制

在 Java 的默认类加载机制中,双亲委派模型(Parent-First Class Loading)指的是,当一个类加载请求发生时,类加载器会首先将请求委派给父加载器处理。如果父加载器无法加载该类,才会由当前加载器进行加载。这个机制确保了核心类(例如 JDK 中的类)始终由系统类加载器加载,避免了系统类和应用类的冲突。

Tomcat 如何打破双亲委派机制

Tomcat 中的类加载机制使用了自定义的 ClassLoader,它主要依赖于 WebappClassLoaderCatalinaClassLoader 来处理类的加载,从而打破了传统的双亲委派模型。具体表现为:

  1. WebappClassLoader

    • 每个部署的 Web 应用程序(即每个 .war 包)都有自己的类加载器,通常是 WebappClassLoader。这个加载器用于加载 Web 应用的类,包括 JSP 文件、Servlet 类、用户定义的类等。
    • WebappClassLoader 不完全遵循双亲委派机制。它会首先尝试加载应用程序的类,如果应用程序的类加载器无法加载该类,再将请求委派给其父加载器。这样,应用程序可以优先加载自己的类,而不是系统类。
  2. CatalinaClassLoader

    • Tomcat 的 CatalinaClassLoader 负责加载 Tomcat 核心的类,它是所有 Tomcat 服务器相关的类加载器。Tomcat 通过 CatalinaClassLoader 加载 Tomcat 内部的类和库文件,而这些类通常是 Tomcat 自身使用的。
  3. 破坏双亲委派的机制

    • Tomcat 使用的 ClassLoader 实现方式使得 Web 应用的类加载器会优先加载 Web 应用内部的类,而不是由父加载器(通常是 CatalinaClassLoaderCommonClassLoader)来加载。这是打破双亲委派机制的关键,使得 Web 应用能够灵活地加载自己的类和资源。
    • Web 应用的类加载器可以加载应用自己的类,而系统类(例如 Java 标准库类)则通过委派给父加载器来加载。

Tomcat 中类加载的层级结构

在 Tomcat 中,类加载器分为多个层级,打破双亲委派机制的方式如下:

  1. 系统类加载器(System ClassLoader):加载 JDK 的核心类。
  2. Catalina 类加载器(CatalinaClassLoader):加载 Tomcat 本身的类。
  3. Common 类加载器(CommonClassLoader):加载 Tomcat 公共类库中的类。
  4. Webapp 类加载器(WebappClassLoader):每个 Web 应用程序都会有自己的 Webapp 类加载器,用来加载 Web 应用特有的类。

在这种结构中,Web 应用的类加载器会优先加载自己应用的类,而不是委派给父类加载器。这种做法避免了 Web 应用和 Tomcat 内部类的冲突。

最近更新时间:2024-12-02