想要了解 Tomcat 的启动和初始化过程,就应该从启动入口org.apache.catalina.startup.Bootstrap类开始。
main()
Bootstrap类的main()方法中,主要的任务是:
- 实例化Bootstrap对象,并调用其
init()方法 - 如果传入的命令是启动Tomcat,则调用其
load()和start()方法。
传入的命令参数startd和start的区别是设置了一个布尔变量await为true。
|
|
初始化
静态块
静态块的主要任务是初始化路径:
- HOME 路径:代表 Tomcat 的安装目录
- BASE 路径:代表 Tomcat 的工作目录。
如果想要运行Tomcat 的 多个实例,但是不想安装多个Tomcat软件副本。那么可以配置多个工作目录,每个运行实例独占一个工作目录,但是共享同一个安装目录。
init()
Bootstrap的init()的主要任务是:
初始化类加载器
Tomcat类加载器:commonLoader、catalinaLoader、sharedLoader。
主线程的classLoader设置为catalinaLoader,安全管理的classLoad设置为catalineLoader。
初始化Bootstrap的
Catalina对象
通过反射生成Catalina对象,并通过反射调用setParentClassLoader方法设置其父 ClassLoader为sharedLoader。
|
|
load()
Bootstrap的load()方法通过反射调用Catalina对象的load()方法。
Catalina的load()方法主要任务是:
- 初始化命名服务的基本配置
- 创建一个Digester类对象,默认用于解析
conf/server.xml,将xml文件转换成相应的对象。 - 调用
Server的init()方法。
|
|
start()
Bootstrap的start()方法通过反射调用Catalina对象的start()方法。
Catalina的start()方法主要任务是:
- 调用
Server的start()方法。 - 注册
shutdown的钩子
|
|
感谢:
阿里技术专家,楚岩:Tomcat源码分析系列博客