Tomcat 架构分析(二)
ClassLoader详解
前言:
上一节提到,Tomcat的五个子模块:
Jsper模块
、
Servlet和Jsp模块
、
Catalina模块
、
Connector模块
、
Resource模块
,本节是对lib包下的
详细讲解,以及Tomcat是如何加载类(
ClassLoader
)
1.简介
与许多服务器应用程序一样,Tomcat安装了各种类装入器(也就是实现java.lang.classloader的类),以允许容器的不同部分和在容器上运行的web应用程序访问不同的可用类和资源的存储库。
该机制用于提供Servlet规范中定义的功能。
在Java环境中,类装入器被安排在父-子树中。
通常,当一个类装入器被要求装入一个特定的类或资源时,它首先将请求委托给父类装入器,然后只在父类装入器(s)不能找到所请求的类或资源时才查找它自己的存储库。
请注意,web应用程序类加载器的模型与下面略有不同,但主要原则是相同的。
在启动Tomcat时,它会创建一组类装入器,这些装入器会被组织到下面的父-子关系中,其中父类装入器位于子类装入器之上:
2.类加载的定义
如上图所示,Tomcat在初始化时创建了以下类加载器:
1.Bootstrap
——
这个类装入器包含Java虚拟机提供的基本运行时类,以及从系统扩展目录(javahome/jre/lib/ext)中提供的JAR文件的任何类。
注意:有些jvm可能会将它作为一个以上的类装入器来实现,或者它可能不可见(作为一个类装入器)。
2.System ——
这个类装入器通常从CLASSPATH环境变量的内容中初始化。
对于Tomcat内部类和web应用程序,所有这些类都是可见的。
然而,标准的Tomcat启动脚本($catalinahome/bin/catalina.
sh或%catalinhome%bin catalina.bat)完全忽略CLASSPATH环境变量本身的内容,
而是从以下存储库构建系统类装入器: