3.1 创建类加载器
首先通过initClassLoaders()方法创建了三个类加载器,对应为以下的三个变量赋值:
ClassLoader commonLoader = null; ClassLoader catalinaLoader = null; ClassLoader sharedLoader = null;
对应的配置在conf/catalina.properties文件中,配置如下
common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar" server.loader= shared.loader=
common.loader是另外两个类的父级,默认情况下,server.loader和shared.loader未作配置,返回结果同common.loader。
3.2 创建并初始化catalinaDaemon
在init()的后半部分,通过反射方式根据"org.apache.catalina.startup.Catalina"创建了Catalina对象,并调用其“setParentClassLoader”方法将sharedLoader赋值给它的parentClassLoader属性。
为什么要通过反射的方式来进行创建?
Bootstrap类的注释已经说明,主要是为了类的隔离。但这也导致了调用Catalina对象的方法也需要通过getMethod的方法获取并调用。
4. 控制Tomcat的启动状态
main方法的后半部分,通过传进来的arg值来确定执行的操作
String command = "start"; if (args.length > 0) { command = args[args.length - 1]; } if (command.equals("startd")) { args[args.length - 1] = "start"; daemon.load(args); daemon.start(); } else if (command.equals("stopd")) { args[args.length - 1] = "stop"; daemon.stop(); } else if (command.equals("start")) { daemon.setAwait(true); daemon.load(args); daemon.start(); if (null == daemon.getServer()) { System.exit(1); } } else if (command.equals("stop")) { daemon.stopServer(args); } else if (command.equals("configtest")) { daemon.load(args); if (null == daemon.getServer()) { System.exit(1); } System.exit(0); } else { log.warn("Bootstrap: command \"" + command + "\" does not exist."); }
arg是调用tomcat传的参数,若未传则默认是“start”,根据这个命令来控制tomcat的状态。
看起来简单的start、stop方法,背后的逻辑比较复杂,下文单独作为一个专题讲解。