Tomcat源码阅读1
来源:互联网 发布:java模拟登录教务系统 编辑:程序博客网 时间:2024/05/16 01:11
系统的启动流程:
tomcat通常从脚本启动,查看脚本可知,startup.sh中调用了catalina.sh进行启动,而在catalina.sh中,可以看到时启动了Bootstrap类
org.apache.catalina.startup.Bootstrap "$@" start
从bootstrap类的main方法开始启动,此类中有
private Object catalinaDaemon = null ; protected ClassLoader commonLoader = null ;protected ClassLoader catalinaLoader = null ;
等,首先new boostrap对象,调用init方法,init方法中先调用initClassLoader方法,获取 三种ClassLoader,分别是:commonLoader、catalinaLoader 、sharedLoader ,在此说明一句,如果commonLoader初始化失败,即没有config配置文件,则将bootstrap的Classloader赋值给commonLoader。
先从commonLoader说起,
String value = . getProperty(name + ".loader");
此处使用了CatalinaProperties类,这个类有
static{ loadProperties();}
会随着类的加载而运行,加载了加载Catalina.Properties配置文件,通过字符串common.loader获取此属性文件对应的配置:
common.loader="${catalina.base}/lib", "${catalina.home}/lib/*.jar"
然后通过replace方法处理拿到的字符串,替换为对应config目录; D:\SVN\CodeLearning\Tomcat8\output\build/lib,根据四种模式:DIR JAR URL GLOB去扫描相应类,最后通过
ClassLoaderFactory. createClassLoader(repositories, parent)
方法,将String类型的加载路径字符串穿进去,在此方法中使用LinkedHashSet,扫描将要加载的类,对应四种不同的模式,然后将这个LinkedHashSet.toArray,赋值给链表,最后
return new URLClassLoader(array);
把要加载路径赋值进去,返回一个URLClassLoader,并加载各种类。所以commonLoader就是URLClassLoader。接上面的,如果没有config,则使用bootstrap的ClassLoader给commonLoader。
同理,catalinaLoader和sharedLoader的加载方式:
catalinaLoader = createClassLoader( "server", commonLoader ); sharedLoader = createClassLoader("shared" , commonLoader );
由此可见commonloader是其父类加载器。不过server.loader和sharedLoader在Catalina.properties中没配置属性。当调用 catalinaLoader = createClassLoader( “server” , commonLoader );
sharedLoader = createClassLoader(“shared” , commonLoader );
时,
String value = CatalinaProperties. getProperty(name + ".loader"); if ((value == null) || (value.equals(""))) return parent;
由于properties文件没有对应的server.loader和shared.loader属性,古直接返回URLClassLoader加载器。
综上,三种加载器初始化完毕,调用Thread. currentThread().setContextClassLoader( catalinaLoader);
将catalinaLoader设置为当前线程的加载器。 然后调用
Class<?> startupClass = catalinaLoader.loadClass ("org.apache.catalina.startup.Catalina");
在加载catalina类,使用反射,调用其setParentClassLoader方法,参数为java.lang.ClassLoader.
然后调用catalina的isAwait和start方法,启动服务器。
Method method = catalinaDaemon.getClass().getMethod ("start" , (Class [] )null );
- tomcat源码阅读-1
- Tomcat源码阅读1
- Tomcat源码阅读#1:classloader初始化
- tomcat源码阅读的趣事1
- tomcat源码阅读-2
- tomcat源码阅读-3.1
- Tomcat源码阅读计划
- Tomcat源码阅读
- Tomcat源码阅读系列
- Tomcat源码阅读二
- Tomcat源码阅读,标记下。
- Tomcat源码阅读,标记下
- tomcat 源码阅读步骤一
- tomcat源码阅读步骤二
- tomcat源码阅读步骤三
- tomcat源码阅读步骤四
- tomcat源码阅读步骤五
- tomcat源码阅读步骤六
- 针对软键盘挡住input输入框的问题
- 易学易用的Windows PowerShell
- 微信登录没有回调iOS
- mysql中key 、primary key 、unique key 与index区别
- JDK的命令行工具
- Tomcat源码阅读1
- 解决 multiple definition of
- linux文件描述符
- 48. Rotate Image(矩阵翻转)
- SQL语句 合并列值 将一列的多个值合并成一行
- UDP实现可靠数据传输
- ArcEngine 拓扑中 数据锁的使用
- js 创建对象、属性、方法
- 关于新浪短链接多个参数问题