五、Tomcat源码分析-启动分析(三) Catalina启动
在上一篇文章中,我们分析了tomcat的初始化过程,是由Bootstrap反射调用Catalina的load方法完成tomcat的初始化,包括server.xml的解析、实例化各大组件、初始化组件等逻辑。那么tomcat又是如何启动webapp应用,又是如何加载应用程序的ServletContextListener,以及Servlet呢?我们将在这篇文章进行分析
我们先来看下整体的启动逻辑,tomcat由上往下,挨个启动各个组件:

针对如此复杂的组件关系,tomcat 又是如何将各个组件串联起来,实现统一的生命周期管控呢?在这篇文章中,我们将分析 Service、Engine、Host、Pipeline、Valve 组件的启动逻辑,进一步理解tomcat的架构设计
1、Bootstrap
启动过程和初始化一样,由Bootstrap反射调用Catalina的start方法
public void start() throws Exception {
if( catalinaDaemon==null ) init();
Method method = catalinaDaemon.getClass().getMethod("start", (Class [] )null);
method.invoke(catalinaDaemon, (Object [])null);
2、Catalina
主要分为以下三个步骤,其核心逻辑在于Server组件:
1、 调用Server的start方法,启动Server组件;
2、 注册jvm关闭的勾子程序,用于安全地关闭Server组件,以及其它组件;
3、 开启shutdown端口的监听并阻塞,用于监听关闭指令;
public void start() {
// 省略若干代码......
// Start the new server
try {
getServer().start();
} catch (LifecycleException e) {
// 省略......
return;
}
// 注册勾子,用于安全关闭tomcat
if (useShutdownHook) {
if (shutdownHook == null) {
shutdownHook = new CatalinaShutdownHook();
}
Runtime.getRuntime().addShutdownHook(shutdownHook);
}
// Bootstrap中会设置await为true,其目的在于让tomcat在shutdown端口阻塞监听关闭命令
if (await) {
await();
stop();
}