2024-10-26  阅读(41)
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1567566393

回答

Tomcat 要破坏双亲委派模型的原因主要是为了实现 Web 应用程序的隔离性。我们知道 Tomcat 可能会部署多个 Web 应用,如果多个应用程序使用了不同版本的相同类库,如果不打破双亲委派模型就会容易出错。

Tomcat 使用了自定义的类加载器,WebAppClassLoader。没有 Web 应用都有自己的 WebAppClassLoader,该实例负责加载该 Web 应用程序的类,但这个类并不遵循双亲委派模型:在加载类时它会首先检查需要加载的类是否位于 Web 应用程序的类路径下的。如果是的话,它就不会委派给父类加载器,而是自己负责加载。

详解

Tomcat 为什么需要打破双亲委派模型

在 Tomcat 不是项目时,我们将 war 包放到 tomcat 的 webapp 目录下,而且可以放多个,1 个代表了一个 Web 应用程序,这就意味着一个 Tomcat 可以不是多个 Web 应用程序。

假如现在有两个 Web 应用程序 Web1 和 Web2,他们都有一个共同的类,UserService,而且它们的类全限定名都一样,比如都是com.skjava.UserService,但是他们的具体实现是不一样的,为了保证他们不冲突,就需要 Web1 和 Web2 各自加载各自的 UserService,需要互相隔离。所以为了保证多个 Web 应用程序之间的隔离性,我们需要打破传统的双亲委派模型。

同时,由于打破了双亲委派模型,多个 Web 应用程序之间是互相隔离的,我们可以在不重启整个 Tomcat 服务器的情况下,实现热部署或者重新加载单个 Web 应用程序,从而提高了开发和部署的灵活性。

Tomcat 是怎样打破双亲委派模型的