Tomcat如何隔离Web应用?
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
Tomcat的自定义类加载器WebAppClassLoader打破了双亲委托机制,首先自己尝试去加载某个类,如果找不到再代理给父类加载器
- 其目的是优先加载Web应用自己定义的类。
- 具体实现就是重写ClassLoader的两个方法:findClass和loadClass。