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