Tomcat启动过程

startup.bat
当我们启动tomcat一般是运行%TOMCAT_HOME%\bin\startup.bat文件,这个文件实际上调用了%TOMCAT_HOME%\bin\catalina.bat批处理文件。
startup.bat将start命令和控制台的所有参数都传给了catalina.bat文件。
org.apache.catalina.startup.Bootstrap类正是Tomcat的入口类,Tomcat正是从Bootstrap类的main方法开始运行的。

Bootstrap
下面来看看Bootstrap的main方法做了哪些事情:
main方法做了3件事情:
1、初始化;
2、装配tomcat容器
3、启动tomcat容器

初始化
1、设置catalina.home系统属性
如果catalina.home被设置过直接返回,否则设置:如果bootstrap.jar文件存在,就设置为这个文件所在目录的上一级目录;如果不存在就设置为当前工作目录。在%TOMCAT_HOME%\bin目录下实际上是有这个jar文件的,也就是catalina.home=%TOMCAT_HOME%。
2、设置catalina.base系统属性,和1差不多
3、initClassLoaders,初始化三个classLoader:
commonLoader:用于加载common/lib目录下的jar包和class文件
catalinaLoader:用于加载server/lib目录下的jar包和class文件
sharedLoader:用于加载shared/lib目录下的jar包和class文件
commonLoader是catalinaLoader和sharedLoader的parent classloader,Tomcat6以后,查看catalina.properties文件可以看见server.loader和shared.loader都是为空的。
catalina.properties文件中common.loader= catalina.base/lib, {catalina.base}/lib/.jar, catalina.home/lib, {catalina.home}/lib/.jar
4、然后设置当前线程的classloader为catalinaLoader
5、紧接着加载与安全相关的包和类
6、然后设置org.apache.catalina.startup.Catalina这个类的parent classloader为sharedLoader
7、创建org.apache.catalina.startup.Catalina这个类的实例并赋给catalinaDaemon

装配容器
1、初始化目录和命名规则,为digester解析XML做准备,digester准备后面再研究一下
2、创建一个digester对象,解析conf/server.xml文件,在解析server.xml的过程中会调用StandardService.setContainer方法,将其设置为StandardEngine
3、初始化Servlet窗口,这里的getServer()实际上返回的是StandardServer对象,这个初始化过程是在StandardServer类的initInternal方法中完成的,这个方法主要干了两件事,1是注册MBean,让JMX管理tomat容器,2是初始化Service
启动容器
此处的start调用的是org.apache.catalina.startup的start方法
start方法会调用StandardServer、StandardService、StandardEngine、StandardHost、StandardContext、StandardWrapper的start或者startInternal方法来完成启动过程,最后会循环等待,在关闭命令到来之前一直运行!

总结

1、tomcat中大量引入了模板方法模式,org.apache.catalina.util.LifecycleBase被所有容器继承,其中initInternal和startInternal方法是抽象方法,在初始化和启动时被每个容器会调用其init和start方法,这两个方法会去调用对应抽象方法***Internal,这些抽象方法都是在子类中实现的
2、tomcat中大量使用了类的反射,基本上都是通过配置文件获取类名,然后利用反射得到class对象,再通过newInstance获取对象。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值