Tomcat 违背双亲委派模式

违背双亲委派模式
【 类加载机制】:

Tomcat 违背双亲委派模式

文章插图
双亲委派模型要求除了顶层的启动类加载器之外,其余的类加载器都应当由自己的父类加载器加载 。
能加载的类都可以被 和使用,从而实现了公有类库的共用,而和 自己能加载的类则与对方相互隔离 。
Tomcat 违背双亲委派模式

文章插图
可以使用加载到的类,但各个实例之间相互隔离 。
而的加载范围仅仅是这个JSP文件所编译出来的那一个.Class文件,它出现的目的就是为了被丢弃:当Web容器检测到JSP文件被修改时,会替换掉目前的的实例,并通过再建立一个新的Jsp类加载器来实现JSP文件的功能 。
【违背双亲委派】: 为了实现隔离性,没有遵守这个约定 , 每个加载自己的目录下的class文件 , 不会传递给父类加载器 。例如:如果 的想加载中的类,该怎么办?我们可以使用线程上下文类加载器实现,使用线程上下文加载器,可以让父类加载器请求子类加载器去完成类加载的动作 。
【违背双亲委派三个方面】:(1)向前兼容;(2)加载SPI接口实现类;(3)热部署
【类加载过程】:
Tomcat 违背双亲委派模式

文章插图
的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类(,等),各个web应用自己的类加载器()会优先加载,加载不到时再交给走双亲委托 。具体的加载逻辑位于e.()方法中,这里以文字描述加载一个类过程:
先在本地缓存中查找是否已经加载过该类(对于一些已经加载了的类,会被缓存在这个数据结构中),如果已经加载即返回 , 否则 继续下一步 。让系统类加载器()尝试加载该类,主要是为了防止一些基础类会被web中的类覆盖,如果加载到即返回 , 返回继续 。前两步均没加载到目标类 , 那么web应用的类加载器将自行加载,如果加载到则返回 , 否则继续下一步 。最后还是加载不到的话,则委托父类加载器( )去加载 。
第3第4两个步骤的顺序已经违反了双亲委托机制,除了之外,JDBC,JNDI,.().r();等很多地方都一样是违反了双亲委托 。
【参考文献】:类加载器破坏双亲委派
学习步骤,附带打破双亲委派模型企业应用实战
【Tomcat 违背双亲委派模式】深入理解 (四) 类加载器之为何违背双亲委派模型