1、contextConfig(),代码在contextconfig中
(1)、获取defaultContextXml,值为conf/context.xml
(2)、获取defaultContextXml的绝对路径,值为D:\workspace\test_tomcat\apache-tomcat-7.0.22-src\output\build\conf\context.xml
(3)、processContextConfig(defaultContextUrl);
1)、StandardContext[/docs]中增加watchedResources,D:\workspace\test_tomcat\apache-tomcat-7.0.22-src\output\build\conf\context.xml
2)、通过Digester往StandardContext[/docs]中,增加watchedResources为WEB-INF/web.xml
(4)、判断hostContextFile是否存在,结果不存在,如果存在进行增加D:\workspace\test_tomcat\apache-tomcat-7.0.22-src\output\build\conf\Catalina\localhost\context.xml.default
(5)、判断context.getConfigFile()是否为null,结果不存在,如果存在进行增加file:/D:/workspace/test_tomcat/apache-tomcat-7.0.22-src/output/build/webapps/docs/META-INF/context.xml
2、createWebXmlDigester(context.getXmlNamespaceAware(),
context.getXmlValidation());主要是获取webDigesters和webFragmentDigesters对象
3、fixDocBase(); 设置StandardContext的docBase为docs。
4、TldConfig
(1)、init方法,创建tldDigester。
5、setStateInternal(LifecycleState.STARTING_PREP,null, false),当前对象为StandardContext,有3个listeners。
(1)、ContextConfig,进入beforeStart()方法,调用antiLocking();判断条件antiResourceLocking,结果为false,没有去执行。
(2)、MemoryLeakTrackingListener,在此阶段没动作
(3)、TldConfig,在此阶段没动作
6、startInternal(),为StandardContext的startInternal()方法。
(1)、Send j2ee.state.starting notification
(2)、判断namingResources,结果为null
(3)、判断webappResources,结果为null,设置setResources(new FileDirContext());将对webappResources进行赋值。
(4)、resourcesStart()
1)、webappResources属性的赋值
2)、Mbean注册
(5)、设置webappLoader,其中getParentClassLoader()为StandardClassLoader也就是第二章提到的sharedLoader,通过第六章第三小节注入。
1)、创建webappLoader,设置partnerClassLoader为sharedLoader
2)、设置delegate为false。
3)、设置loader
(6)、getCharsetMapper(),设置charsetMapper
(7)、postWorkDirectory(),设置工作目录,为work\Catalina\localhost\docs,设置了ApplicationContext的context
(8),进行检查,Web Application
(9)、增加一个StandardContext的ls的listener为NamingContextListener
(10)、当前线程与DirContext进行绑定,这里返回一个classLoader。其中bindThread()与unbindThread(oldCCL)主要是进行当前线程的classLoader切换。加载应用的和当前类。
(11)、loader进行start,后续介绍
(12)、fireLifecycleEvent(Lifecycle.CONFIGURE_START_EVENT, null); StandardContext的ls有4个listeners,4个listeners对configure_start这个事件进行执行,后续介绍
(13)、child.start,这里的child指的是StandardWrapper,也就是servlet
(14)、Pipeline[StandardEngine[Catalina].StandardHost[localhost].
StandardContext[/docs]]的pipeline进行start。
(15)、进行Manager的设置,后续介绍。
(16)、在servlet context中放入resources。
如下图
其中getResouces为如下图。
(17)、设置mapper属性,mapper.setContext(getPath(),welcomeFiles, resources);
(18)、在servlet context中设置InstanceManager的kv,具体内容后续介绍。
(19)、DedicatedThreadExecutor temporaryExecutor = new DedicatedThreadExecutor();创建一个线程池。
(20)、在servlet context中设置JarScanner的kv
(21)、mergeParameters();
(22)、用线程池运行listenerStart()任务。在StandardContext中
(23)、StandardManager.start,后续介绍
(24)、super.threadStart(),调用父类ContainerBase的threadStart方法。
(25)、用线程池运行filterStart()任务。Filter的init方法。
(26)、loadOnStartup(findChildren())的启动。里面用的treeMap对等级排序,然后启动,代码如下。调用serlvet的init方法。
(27)、setState(LifecycleState.STARTING),StandardContext的ls的4个listeners。
1)、ContextConfig,在此阶段没动作。
2)、MemoryLeakTrackingListener,在此阶段没动作。
3)、TldConfig,在此阶段没动作。
4)、NamingContextListener,在此阶段没动作。
7、setStateInternal(LifecycleState.STARTED, null, false),StandardContext的ls的4个listeners。
(1)、ContextConfig,在此阶段没动作。
(2)、MemoryLeakTrackingListener,在after_start状态下,设置childClassLoaders.put(context.getLoader().getClassLoader(),context.getServletContext().getContextPath());其中key= WebappClassLoader,value= /docs
(3)、TldConfig,在此阶段没动作。
(4)、NamingContextListener,在此阶段没动作。