①. Tomcat类加载机制
①. 可以看到,在原来的 JVM 的类加载机制上面,Tomcat 新增了几个类加载器,包括 3 个基础类加载器和每个 Web 应用的类加载器。3个基础类加载器在 conf/catalina.properties 中进行配置:
common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar" server.loader= shared.loader=
②.Common:以应用类加载器为父类,是Tomcat顶层的公用类加载器,其路径由conf/catalina.pr operties中的common.loader指定,默认指向${catalina.home}/lib下的包
③. Catalina:Tomcat容器私有的类加载器,加载路径中的class对于Webapp不 可见,其路径由server.loader指定,默认为空,此时Tomcat使用Common类加载器加载应用服务器
④. Shared:以Common类加载器为父类,是所有Web应用的父类加载器,其路径由shared.loader指定,默认为空,此时Tomcat使用Common类加载器作为Web应用的父加载器
⑤. Web应用:以Shared类加载器为父类,加载/WEB-INF/classes目录下的未压缩的Class和资源文件以及/WEB-INF/lib目录下的jar包,该类加载器只对当前Web应用可见,对其他Web应用均不可见
⑥. Tomcat8 和 Tomcat6比较大的区别是:
Tomcat8可以通过配置 <Loader delegate="true"/>表示遵循双亲委派机制
②. Tomcat执行顺序
①. 使用bootstrap引导类加载器加载
②. 使用system系统类加载器加载
③. 使用应用类加载器在WEB-INF/classes中加载
④. 使用应用类加载器在WEB-INF/lib中加载
⑤. 使用common类加载器在CATALINA_HOME/lib中加载
⑥.我们已经知道了tomcat为什么要这么设计,以及是如何设计的,那么,tomcat违背了java推荐的双亲委派模型了吗?答案是:违背了。我们前面说过:双亲委派模型要求除了顶层的启动类加载器之外,其余的类加载器都应当由自己的父类加载器加载。
很显然,tomcat不是这样实现,tomcat为了实现隔离性,没有遵守这个约定,每个webappClassLoad er加载自己的目录下的class文件,不会传递给父类加载器。