我在以前写过一些纯粹的后端程序,对于这样的程序,当程序启动的时候,我想,最重要的是什么呢?
我在哪里?对,就是我这个程序运行在那个目录,我的配置文件放在哪里?我的日志文件放在哪里?我的临时文件放哪里?
首先,一个类来负责将这些信息采集到手,转换为创建某个对象传入的参数。
tomcat是一个应用程序,所以,首先要做的事情,就是找到自己运行所在的目录,因为启动程序,都是使用java这个命令,那么发生这个命令的调用的目录,也可能是在启动脚本中设置的目录。
一般,调用java的System.getProperties("user.dir");这个获得的是运行java程序所在的目录,未必就是tomcat的真实的目录,所以,需要判断是不是不存在系统属性里面配置了catallina.home,如果配置了,就使用,否则,就使用user.dir这个目录作为运行目录。
启动程序的两个可能途径:
1.在程序放置的真实目录执行脚本启动
2.将脚本放置到PATH路径内,在其他任何目录都能通过脚本启动
Bootstrap类
静态初始化代码块的功能,
1.确定catalina.home和catalina.base
catalina.home是安装目录,运行程序必须的两个目录lib和bin
catalina.base是运行tomcat实例必须的,个性化的目录conf ,temp , webapps ,logs 这个四个目录
这个类设置好这两个属性,提供给程序后续使用。
要启动tomcat,至少需要catalina.home才能启动,没有catalina.base的话,就把catalina.home当做catalina.base使用。
2.初始化好三种类加载器,为后续启动webapp应用做准备
三种类加载器的实现方式,具有不同名称和父加载器的ClassLoaderFactory的产生的实例而已。
这里的类加载器实现方式,纯粹的是把指定的目录下面的资源都提前枚举出来,当调用load方法时,依次遍历而已罢了。
如果把jdk提供的类加载器抽象成一个,简称为jdk类加载器,那么,这个类加载器下面,就是tomcat的common类加载器,而这个common类加载器下面就分别有server类加载器和shared类加载器。
这里创建好类加载器,就为创建catalina对象做好了准备了。
一个Bootstrap对象,负责初始化一个catalina对象,是1对1的关系。
3.创建catalina对象
在main方法里面,根据传入的参数,反射调用catalina对象的同名的方法。