Tomcat在打破双亲委派机制方面采用了一个比较特殊的类加载器结构。这种结构允许每个Web应用程序(每个Context
)都有自己的类加载器,并在这些类加载器之间创建一种层次关系,以便实现一定程度的隔离。
具体来说,Tomcat使用的类加载器结构包括以下几个关键组件:
-
Bootstrap Class Loader(启动类加载器): 由JVM提供,用于加载Java核心类库,如
java.lang
包下的类。 -
Common Class Loader(公共类加载器): 由Tomcat提供,负责加载Tomcat本身所需的类,例如
Servlet API
。它位于$CATALINA_HOME/lib
目录下。 -
Catalina Class Loader(Catalina类加载器): 也由Tomcat提供,是每个
Context
的父类加载器。它加载存放在$CATALINA_BASE/lib
目录下的类。 -
Shared Class Loader(共享类加载器): 也由Tomcat提供,用于加载所有Web应用程序都能共享的类。它加载存放在
$CATALINA_BASE/lib
目录下的类,但与Catalina类加载器不同,Shared类加载器是所有Context
共享的。 -
Webapp Class Loader(Web应用程序类加载器): 每个
Context
都有自己的Web应用程序类加载器,用于加载该Web应用程序中的类。它是Catalina类加载器的子加载器。
通过这样的类加载器层次结构,每个Web应用程序都有自己的类加载器,可以在一定程度上隔离彼此。这使得不同Web应用程序可以使用不同版本的库,而不会相互干扰。
这种结构打破了双亲委派机制的直接性,因为Web应用程序类加载器可以先尝试加载类,而不必委托给父加载器。然而,它仍然保持了一定的层次性,以确保一些基础的类库仍然由更上层的加载器加载。这样既保留了一定的隔离性,又确保了某些类的唯一性。
Was this helpful?
0 / 0