Tomcat如何隔离Web应用?

假如使用JVM默认AppClassLoader来加载Web应用,AppClassLoader只能加载一个Servlet类。

在加载第二个同名Servlet类时,AppClassLoader会返回第一个Servlet类的Class实例。

在AppClassLoader看来,同名的Servlet类只被加载一次。

因此Tomcat的解决方案是自定义一个类加载器WebAppClassLoader,并且给每个Web应用创建一个类加载器实例。

  • Context容器组件对应一个Web应用,因此,每个Context容器负责创建和维护一个WebAppClassLoader加载器实例。

SharedClassLoader

作为WebAppClassLoader的父加载器,专门来加载Web应用之间共享的类。

如果WebAppClassLoader自己没有加载到某个类,就会委托父加载器SharedClassLoader去加载这个类。

SharedClassLoader会在指定目录下加载共享类,之后返回给WebAppClassLoader。

CatalinaClassLoader:专门来加载Tomcat自身的类。

CommonClassLoader

1358

Tomcat的自定义类加载器WebAppClassLoader打破了双亲委托机制,首先自己尝试去加载某个类,如果找不到再代理给父类加载器

  • 其目的是优先加载Web应用自己定义的类。
  • 具体实现就是重写ClassLoader的两个方法:findClass和loadClass。