Tomcat源码分析 · 贰 —— 启动过程剖析
前言
今天我们来继续分析tomcat
源码,昨天我们已经分析完了它的启动脚本和其中的init
方法,我们现在知道init
其实就是进行了ClassLoader
的初始化操作,其中资源路径来源于catalina.properties
文件,同时我们还知道最终初始化的ClassLoader
是URLClassLoader
。
下面我们来看下Tomcat
启动过程中的其他操作。
Tomcat
昨天关于init
方法还没讲完,所以今天先要继续分析剩余内容。
init方法补充
关于init
方法其实昨天基本上已经分析完了,因为昨天后半段都在分析initClassLooders
方法,所以今天回过头再来补充下init
后续的其他方法。
首先是setContextClasserLoader
,这里的操作其实就是设置容器的类加载器,而这里的类加载器就是intiClassLoaders
中生成的创建的类加载器。这个方法方法就是一个简单赋值操作就不展开讲了,需要注意的是这里获取并建议了java
的安全策略管理器:
然后是加载类的操作securityClassLoad
,这里也校验了安全策略管理器,下面截图已经详细展示了每一个操作具体加载的包,然后通过类的加载方法loadClass
加载对应包下的类:
再接着,通过catalinaLoader
类加载器,加载了org.apache.catalina.startup.Catalina
,并创建它的实例,最后反射调用它的setParentClassLoader
方法,设置父级类加载器为java.lang.ClassLoader
,最终将实例化结果赋值给BootStrap
的catalinaDaemon
属性,至此init
方法执行完成。
继续main方法
执行完bootstrap
的初始化操作之后,会把bootstrap
赋值给daemon
,然后紧接着会解析command
命令,分别执行它的setAwait
、 load
和start
方法,这里调用方式都是反射,最终都调用的是catalinaDaemon
实例对应的方法:
我们先看下setAwait
方法,这里的catalinaDaemon
就是前面我们实例化的org.apache.catalina.startup.Catalina
,然后反射调用它的setAwait
方法:
load
方法调用也差不多:
start
方法也是一样的:
好了,今天就先分享这么多,明天我们在深入剖析下catalina
中对应方法的实现。
总结
从目前来看,Tomcat
的启动过程确实笔记简单,短短几行代码就启动成功了,不过核心的功能应该还在后面,让我们拭目以待吧。
最后再探讨一个非技术问题,这两天看源码一直有个问题,为啥Tomcat
中有很多变量都用到了catalina
这个单词,是有什么特殊含义吗?百度之后,发现catalina
直接翻译过来就是凯特琳娜,所以网上有两种说法,一种说法是开发者老婆的名字叫凯特琳娜,一种说法是美国西海岸有一个叫catalina
的小岛,开发者比较喜欢那里,所以叫这个名字。我觉得第一种可能性还是蛮高的,毕竟Tomcat
本身就是作者养的一只猫的名字,所以catalina
是他老婆的名字也很顺理成章,而且这也算是程序员的浪漫吧!我的变量里面有你的影子……