Tomcat是如何打破“双亲委派“机制的
Tomcat打破了Java的双亲委派模型,主要是为了能够在Tomcat容器内部进行Web应用的类加载器隔离,以及其他一些定制的类加载需求。
在Java中,双亲委派模型指的是当一个类加载器需要加载一个类时,它会先委派给其父加载器,只有当父加载器无法加载时,才会尝试自己加载。Tomcat打破这一模型的主要原因是为了实现Web应用的隔离加载,每个Web应用都有自己的类加载器,以防止类之间的冲突。
Tomcat打破双亲委派的关键在于它自定义了ClassLoader
类,用于加载Web应用的类。具体做法是,Tomcat为每个Web应用创建了一个WebappClassLoader
,它扩展了标准的URLClassLoader
,并覆盖了findClass
方法,使得它能够在加载类时绕过常规的双亲委派流程。
以下是一个简化的例子,展示了Tomcat如何打破双亲委派模型:
public class WebappClassLoader extends URLClassLoader {
// ...
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
// 尝试从Web应用的本地缓存加载类
// 如果未找到,则绕过父加载器,直接尝试加载类
// ...
return super.findClass(name);
}
// ...
}
在这个例子中,WebappClassLoader
覆盖了findClass
方法,使得它能够在自己的路径下尝试加载类,而不是首先委派给父加载器。这样,每个Web应用都有自己的类加载器,实现了类的隔离加载。
评论已关闭