一、类加载器的创建
在之前的Tomcat启动源码中,简单的介绍了Tomcat的四种类加载器,再复习一遍。
| 类加载器 |
作用 | 父加载器 |
| commonLoader(共同类加载器) | 加载$CATALINA_HOME/lib下的类加载器 | 应用类加载器 |
| catalinaLoader(容器类加载器) | 加载Tomcat应用服务器的类加载器,可以理解为加载Tomcat源码中的类 | 共同类加载器 |
| sharedLoader(共享类加载器) | 加载应用类加载器的共享的类加载器,例如相同版本的mysql驱动等 | 共同类加载器 |
| webappLoader(Web应用类加载) | 加载Web应用下的类类加载,每个web应用之间是相互隔离的 | 共享类加载器 |
类加载器的结构层次:

commonLoader、catalinaLoader、sharedLoader可以在tomcat下的conf/catalina.properties文件中修改。

在Tomcat的启动中,一开始就创建了commonLoader、catalinaLoader、sharedLoader类加载器并且加载对应设置的资源。
Bootstrap:
private void initClassLoaders() {
try {
//读取catalina.properties下的common.loader资源加载
//commonLoader的父类加载器是应用类加载器(不设置都默认为应用类加载器)
commonLoader = createClassLoader("common", null);
if( commonLoader == null ) {
commonLoader=this.getClass().getClassLoader();
}
//读取catalina.properties下的server.loader资源加载
//catalinaLoader的父类加载器是commonLoader
catalinaLoader = createClassLoader("server", commonLoader);
//读取catalina.properties下的shard.loader资源加载
//sharedLoader的父类加载器是commonLoader
sharedLoader = createClassLoader("shared", commonLoader);
} catch (Throwable t) {
handleThrowable(t);
log.error("Class loader creation threw exception", t);
System.exit(1);
}
}
private ClassLoader createClassLoader(String name, ClassLoader parent)
throws Exception {
//读取catalina.properties中对应的key值
String value = CatalinaProperties.getProperty(name + ".loader");
//如果没有设值对应的属性值,则返回父类加载器
if ((value == null) || (value.equals("")))
return parent;
//替换掉Tomact的表达式变量值,如catalina.home、catalina.base等为具体的路径
value = replace(value);
List<Repository

本文详细阐述了Tomcat中的四种类加载器(commonLoader、catalinaLoader、sharedLoader和WebappLoader)的作用、结构以及它们在应用隔离和资源管理中的角色,特别探讨了打破双亲委派机制的原因和优势。
最低0.47元/天 解锁文章
5096

被折叠的 条评论
为什么被折叠?



