Tomcat 违背双亲委派模式
【Tomcat 类加载机制】:
双亲委派模型要求除了顶层的启动类加载器之外,其余的类加载器都应当由自己的父类加载器加载。
CommonClassLoader能加载的类都可以被Catalina ClassLoader和SharedClassLoader使用,从而实现了公有类库的共用,而CatalinaClassLoader和Shared ClassLoader自己能加载的类则与对方相互隔离。
WebAppClassLoader可以使用SharedClassLoader加载到的类,但各个WebAppClassLoader实例之间相互隔离。
而JasperLoader的加载范围仅仅是这个JSP文件所编译出来的那一个.Class文件,它出现的目的就是为了被丢弃:当Web容器检测到JSP文件被修改时,会替换掉目前的JasperLoader的实例,并通过再建立一个新的Jsp类加载器来实现JSP文件的HotSwap功能。
【违背双亲委派】: tomcat 为了实现隔离性,没有遵守这个约定,每个webappClassLoader加载自己的目录下的class文件,不会传递给父类加载器。例如:如果tomcat 的 Common ClassLoader 想加载 WebApp ClassLoader 中的类,该怎么办?我们可以使用线程上下文类加载器实现,使用线程上下文加载器,可以让父类加载器请求子类加载器去完成类加载的动作。
【违背双亲委派三个方面】:(1)向前兼容;(2)加载SPI接口实现类;(3)热部署
【Tomcat类加载过程】:
tomcat的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类(Object,String等),各个web应用自己的类加载器(WebAppClassLoader)会优先加载,加载不到时再交给commonClassLoader走双亲委托。具体的加载逻辑位于WebAppClassLoaderBase.loadClass()
方法中,这里以文字描述加载一个类过程:
resourceEntries
这个数据结构中),如果已经加载即返回,否则 继续下一步。第3第4两个步骤的顺序已经违反了双亲委托机制,除了tomcat之外,JDBC,JNDI,Thread.currentThread().setContextClassLoader();
等很多地方都一样是违反了双亲委托。
【参考文献】:Tomcat类加载器破坏双亲委派
tomcat学习步骤,附带打破双亲委派模型企业应用实战
深入理解 Tomcat(四)Tomcat 类加载器之为何违背双亲委派模型
本文发布于:2024-02-01 07:58:11,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170674549135043.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |