1)Tomcat中有Server、Service、Engine、Host.....等容器。这些容器与容器之间相互嵌套;
2)他们都继承了共同的接口 Lifecycle。所以Lifecycle就是这些容器这些java类的顶层接口了
init()方法:初始化容器组件,它必须在启动容器之前调用。它会创建许多对象。
start():启动容器,比如启动一个Server。
stop():停止执行
destroy():销毁这个容器。
3)容器组件实现类
Server容器:一个StandardServer类实例就表示一个Server容器
Service容器:一个StandardService类实例就表示一个Service容器
Engine容器:一个StandardEngine类实例就表示一个Engine容器。
Host容器:一个StandardHost类实例就表示一个Host容器。
Context容器:一个StandardContext类实例就表示一个Context容器。
Wrapper容器:一个StandardWrapper类实例就表示一个Wrapper容器。
4)包含关系的一对一和一对多关系:
一个Server容器可以有多个Service容器
一个Service容器只可以有一个Engine子容器。
一个Engine容器里面可以有多个 Host容器
一个Host容器里可以有多个 Context容器。
一个Host容器中可以有多个Wrapper容器。
5)创建Host实例的同时,为每个Host实例添加监听器HostConfig
6)Host开始start,生成启动事件,发布给监听器,遍历Host的所有监听器【默认只注册的那个HostConfig】去执行
org.apache.catalina.util.LifecycleBase【Host实例】.fireLifecycleEvent
org.apache.catalina.util.LifecycleSupport【Host实例依赖关联的对象】.fireLifecycleEvent
org.apache.catalina.startup.HostConfig.lifecycleEvent
org.apache.catalina.startup.HostConfig.start
HostConfig.java:1407 -->>> deployApps();【部署该Host下的多个web应用,即创建context并读取每个应用的web.xml配置context】
7)部署Host下的某个个web应用,读取并解析应用对应web.xml
1.org.apache.catalina.startup.Constants.ApplicationWebXml中声明了web.xml的位置
2.org.apache.catalina.startup.ContextConfig.getContextWebXmlSource加载webxml的方法
3.org.apache.catalina.startup.ContextConfig.webConfig
WebXml webXml = createWebXml();
// Parse context level web.xml
InputSource contextWebXml = getContextWebXmlSource();
parseWebXml(contextWebXml, webXml, false);
4.parseWebXml中
ContextConfig.java:1899: digester.parse(source);
8)一个Context对象对应一个web应用程序,也就是ServletContext
9)Context初始化【init】之后,start启动容器,产生对应事件,注册的各个监听器开始执行,
10)典型的context的监听器:
servletContextListener
springweb中,ContextLoaderListenser也是servletContextListener子接口,所以事件发生,就会跳到该流程