1. 什么是双亲委派
一般大家我应该先写一篇怎么把.class加载到JVM里面的一篇文档,但是我发现有好多这样的文章了,所以这里就没有必要给大家讲解一下怎么加载的过程了
这里引用一张图,大家看过其他人的博客在看到这张图,就应该知道,一个class怎么加载到JVM里面了。
接下来就是双亲委派了,在了解双亲委派之前呢,大家首先需要了解几个类加载器。
(1)启动类加载器-》Bootstrap ClassLoader
它主要负责加载我们在机器上安装的额Java目录下的核心类。不管我们是做Java开发,还是需要部署Java程序,不管我们是使用的事Windows还是Linux,我们都需要提前安装一个JDK,在你安装的JDK目录下面是不是有一个lib目录,这里就有Java最核心的一些类库,支撑我们的Java开发和运行。
这里只要我们的JVM启动,首先就会依托启动类加载器,去加载你的Java安装目录下的lib目录中的核心类库。
(2)扩展类加载器-》Extension ClassLoader
负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包。
(3)应用程序类加载器-》Application ClassLoader
这个类加载器就负责去加载ClassPath环境变量所指定的路径中的类,大致可以理解为,加载你写好的Java代码,这个类加载器就负责加载你写好的那些类到内存里。
(4)自定义类加载器
最后一个就是自定义加载器,可以根据自己的需求加载你的类。
介绍完了类加载器,那么什么是双亲委派呢?JVM的类加载器是有亲子层级结构的,就是说启动类加载器是最上层的,扩展类加载器在第二层,第三层是应用程序类加载器,最后一层就是自定义类加载器。这个所谓的双亲委派,就是说加载类的时候不是自己先加载的,是先去父加载器里面去询问,是不是可以帮我加载,如果父加载器加载不了再由儿子来加载。
2.Tomcat中为什么不能使用双亲委派
说完上面的双亲委派,那么大家都应该很明白是怎么一回事了,那么为什么Tomcat,没有遵循双清委派呢?
一个Tomcat里面可能方好几个项目,一个项目里面就是一个war包,每一个项目使用的工具可能都不一样,对应的版本可能也不一样。这样如果我在tomcat里面部署两个项目,一serverA和serverB,这两个项目分别使用的事spring2.x和spring3.x,如果tomcat里面使用的是双亲委派,那么怎么让JVM通知支持spring2.x和spring3.x,那么就需要tomcat自己制定一个类加载的机制了。