前面提到Servlet知识一套接口开发标准,标准是不会自己干活的要想使用Servlet需要有相应的容器,Tomcat就是一个Servlet容器。
Tomcat的顶层设计
Tomcat最顶层的容器是Server代表整个服务器,Server中至少包含一个Service用于具体服务,Service包含两部分Connector和Container.Connector负责处理连接的相关事情,并提供Socket与Request、Reponse的转换,Container用于封装和管理Servlet,以及具体处理request请求。
一个Tomcat中只能有一个Server,一个Server可以包含多个Service,一个Service只能包含一个Container,但可以有多个Connector。
Tomcat里的Server是由org.apache.catalina.startup.Catalina来管理的,Catalina是整个Tomcat的管理类,它里面的三个方法load、start、stop分别管理整个服务的生命周,load方法用于读取conf/server.xml文件创建Server并调用Server的init方法进行初始化,start用于启动服务器,stop用于停止服务器,这两个方法都在内部分别调用了Server的start和stop方法,这三个方法都会按照容器的结构逐级调用相应的方法,比如,Server的start方法会调用所有service的start方法,Service里的start方法又会调用所有包含的Container和Connector的start方法,这样整个服务就启动了。
Catalina的await方法也很重要,这个方法是进入一个循环,让主线程不会退出。
start为例显示判断了Server是否创建成功,为null则调用load()方法,之后调用Server启动服务。
BootStrap的启动过程
BootStrap是Tomcat的真正入口,正常情况下Tomcat启动就是调用Bootstrap的Main方法。
main方法非常的简单只有两个部分
(1)首先新建了BootStrap,并执行了init初始化方法
(2)根据mian方法的参数,如果args为空,默认执行初始化操作。
重点关注init方法,init方法里初始化了ClassLoader,并用ClassLoader创建了Catalina实例,然后赋给了变量catalinaDaemon,后面的操作都是使用这个变量。
Server的启动过程
org.apache.catalina.Server接口中提供了addServer(),romoveServer来添加删除Server,Server的init()和start()来循环调用每个Service的init和start方法来启动所有service
Server的默认实现是org.apache.catalina.core.StandardServer,StandardServer又继承LifecycleMBeanBase,LifecycleMBeanBase又继承自LifecycleBase,init和start方法就定义在LifecycleBase中,LifecycleBase的里的方法有调用了initInternal和startInternal,这两个都是模板方法,所以调用时会执行StandardServer的start和init方法,会执行自己的initInternal和startInternal方法。
里面调用了 initInternal方法
实现类LifecycleMBeanBase
StandardServer类继承LifecycleMBeanBase实现Server接口
StandardServer 重写了 StandardServer 的initInternal方法并调用了父类的initInternal方法
Start方法也是如此就没有上图,最后 startInternal里循环调用了Service的start方法,启动了所有service.