关于tomcat的classloader的一点想法

260 阅读1分钟

关于tomcat的classloader相关的帖子网上非常多,我觉得比较好的有:

www.jianshu.com/p/d90e4430b…

blog.csdn.net/qq_38182963…

但是看了很多文章都说tomcat违反了双亲委派模型,可以是通过源码以及一些概念包括tomcat的delegate的设置描述并没有觉得tomcat是因为违反了双亲委派模型才实现多个应用的classpath隔离。

delegate为true,表示tomcat将遵循JVM的delegate机制,即一个WebAppClassLoader在加载类文件时,会先递交给SharedClassLoader加载,SharedClassLoader无法加载成功,会继续向自己的父类委托,一直到BootstarpClassLoader,如果都没有加载成功,则最后由WebAppClassLoader自己进行加载。

delegate为false,表示将不遵循这个delegate机制,即WebAppClassLoader在加载类文件时,会优先自己尝试加载,如果加载失败,才会沿着继承链,依次委托父类加载。

个人觉得: Tomcat可以走双亲委派模式,也可以走违反双亲委派的模式 Tomcat的隔离性在于它的每个应用都有自己的WebappClassLoader以及每个jsp都有自己jasperloader(不同的classloader加载同一个class都是不同的类,实例也不同)。 Tomcat的隔离性不是因为他违反了双亲委派模式,更不是因为他用了上下文模式,上下文模式只是解决了双亲委派模式下上层loader加载下层loader的问题。

image.png