想要了解 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源码分析系列博客