Tomcat为什么要自定义类加载器
有关打破类加载器双亲委派机制的一个举例:
为什么tomcat要自定义类加载器?
-
无法隔离不同web应用的类
比如两个web应用分别依赖同一个库的不同版本(如 log4j 1.x 和 log4j 2.x)
若遵循双亲委派:
- 父加载器加载
log4j-1.2.17.jar
。 - 应用 2 的类加载器委托父加载器时,发现
Log4j
类已加载,被迫使用旧版本,导致兼容性问题。
打破双亲委派后:
- 应用 2 的
WebApp ClassLoader
优先加载自己的log4j-2.14.1.jar
。 - 两个应用使用各自版本的 Log4j,互不干扰。
- 父加载器加载
-
无法支持热部署
Web 应用需要在不重启 Tomcat 的情况下重新加载类,但双亲委派模型下,一旦类被父加载器加载,无法卸载和重新加载(如果不重启Tomcat ,父加载器中加载的类时无法变更的)。
-
tomcat内部是使用WebApp ClassLoader,每个web应用都会独立使用一个类加载器
-
在加载类时,先检查本地缓存,再尝试自己加载,然后才是委派给父加载器
-
这样在 Web 应用重启时,Tomcat 会销毁旧的
WebApp ClassLoader
,并创建新的类加载器重新加载类,旧的类可被 GC 回收,实现热部署。
-
fengdongnan的博客 文章被收录于专栏
记录fengdongnan的知识产出文档,欢迎大家来一起交流学习