Mybatis技术内幕读书笔记(一)Tomcat的类加载器(Classloader)

前言:

我也不知道为什么一本Mybatis的书会有Tomcat的相关内容,不过这是个知识点,需要好好记录。

什么是类加载器:

Java 虚拟机中的类加载器( ClassLoader )负责加载来自文件系统、网络或其他来源的类文件。Java 虚拟机中的类加载器默认使用的是双亲委派模式,其中有三种默认使用的类加载器,分别是Bootstrap ClassLoader 、Extension ClassLoader 和System ClassLoader (也被称为Application ClassLoader ),每种类加载器都己经确定从哪个位置加载类文件。 Bootstrap ClassLoader 负责加载JDK 自带的比jar 包中的类文件,它是所有类加载器的父加载器, Bootstrap ClassLoader 没有任何父类加载器。Extension ClassLoader 负责加载Java 的扩展类库,也就是从jre/lib/ ext 目录下或者java.ext.dirs 系统属性指定的目录下加载类。System ClassLoader 负责从classpath 环境变量中加载类文件, classpath 环境变量通常由classpath 或-cp 命令行选项来定义,或是由JAR 中Manifest 文件的classpath 属性指定。SystemClassLoader 是Extension ClassLoader 的子加载器。

 

Mybatis技术内幕读书笔记(一)Tomcat的类加载器(Classloader)

Tomcat的类加载器:

在Tomcat 中提供了一个Common ClassLoader ,它主要负责加载Tomcat 使用的类和Jar 包以及应用通用的一些类和JAR包,例如CATALINA HOME/lib 目录下的所有类和Jar 包。Tomcat 本身是一个应用系统,所以Common ClassLoader 的父加载器是System ClassLoader 。Tomcat 还提供了CatalinaLoader 和SharedLoader 两个类加载器,它们的父加载器是CommonClassLoader 。但是默认情况下, CatalinaLoader 和SharedLoader 两个类加载器的相应配置( CATALINA HOME/conf/catalina. properties 配置文件中serverl.loader 和shared .loader 配置项)是空的,也就是说,这两个类加载器默认情况下与Common ClassLoader 为同一个加载器。

Tomcat 会为每个部署的应用创建一个唯一的类加载器,也就是WebApp ClassLoader ,它负责加载该应用的WEB-INF /lib 目录下的Jar 文件以及WEB-INF/classes 目录下的Class 文件。由于每个应用都有自己的WebApp ClassLoader ,这样就可以使不同的Web 应用之间互相隔离,彼此之间看不到对方使用的类文件。当对应用进行热部署时,会抛弃原有的WebApp ClassLoader,并为应用创建新的WebApp ClassLoader 。WebApp ClassLoader的父加载器是CommonClassLoader ,所以不同的应用可以使用Common ClassLoader 加载的共享类库最终我们得到Tomcat 中的类加载器的结构如图

Mybatis技术内幕读书笔记(一)Tomcat的类加载器(Classloader)