Tomcat顶层类加载器源码分析
首先我们来看看启动脚本catalina.sh中的一段代码。
可以开单哦最终tomcat通过shell启动时 手动设置了-classpath满足上面描述的加载位置和顺序,然后通过bootstrap.jar包中的org.apache.catalina.Bootstrap类启动,并且制定了启动参数为strat。随后再来看看catalina.properties属性文件中对于上面说到的
Common和server shared类加载器的默认定义
common.loader置顶的加载目录和之前描述的顺序一模一样 且server shared类加载器并没有指定类的路径,默认使用了简化模型,App类加载器下只有一个common类加载器和多个webapp类加载器,现在来看bootstrap对于类加载器的源码实现。
可以看到调用了bootstrap.init方法进行初始化 而我们的类加载器的初始化便在这个方法里面进行初始化,而对于main方法的奇遇部分 暂时不讨论 这里只关注类加载器的源码即可 bootstrap和其他类源码会在后面的tomcat启动 关闭流程中再详细讨论。
我们跟进去init方法
最后创建加载器的方法为createClassLoader 且我们将创建的commonloader加载器设置为了server和shared类加载器的父类加载器
我们继续看createClassloader方法的实现,可以看到通过将CatalinaProperties.getProperty(name + ".loader"); 方法获取到的value字符串解成路径后 包装为Repository对象 供后面创建类加载器时的url做准备 同时这里的Repository对象包含了3个类型 多个jar包的通配符 单个jar包的路径 完成jar包的绝对路径
最终是通过createClassLoader方法来创建类加载器,其中包含了解析的Repository列表和父类加载器 同时我们看到方法入口处的判断,由于没有设置shared server类加载器 所以这两个类加载器就等于common类加载器。从URLClassLoader的源码中看到, 它的构造器智能接收URL统一资源定位符,同时这里也是使用URLclassLoader 所以将Repository对转换为URL对象来处理
从源码中可以看到 不同类型的Repository对象都需要转换为URL 然后最终根据我们之前介绍的jDK基础类加载器URLCLASSloader来创建名字为name 父类加载器为parent的类加载器
Tomcat应用层类加载器源码分析
Loader接口定义了完整的Web应用类加载器的行为。可以设置delegate标志为true 让web应用类加载器满足标准双亲委派模型 同时可以设置reloadable变量为true 就可以结合modified方法来决定是否reload整个类信息,例如我们监听到类发生变化后 是否重新加载 同时包含了监听属性变化的监听器,接下来是Tomcat对于该结构的标准实现类WebappLoader的原理
WebappLoader的原理
通过源码得知 首先创建于WebappLoader对象关联的ClassLoader对象 该classLoader对象用于加载web应用程序所需资源,而且ClassLoader对象也满足Tomcat的生命周期 但是我们从这里看到的是 直接调用了生命周期Lifecycle接口的start方法 并没有使用模版方法
1
原文始发于微信公众号(白帽子):Tomcat源码学习笔记(日更)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论