Tomcat源码解读--代码走读之三十(续)(三十一)

1contextConfig(),代码在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]中增加watchedResourcesD:\workspace\test_tomcat\apache-tomcat-7.0.22-src\output\build\conf\context.xml

    2)、通过DigesterStandardContext[/docs]中,增加watchedResourcesWEB-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

2createWebXmlDigester(context.getXmlNamespaceAware(),

context.getXmlValidation());主要是获取webDigesterswebFragmentDigesters对象

3、fixDocBase(); 设置StandardContextdocBasedocs

4、TldConfig

(1)、init方法,创建tldDigester

5、setStateInternal(LifecycleState.STARTING_PREP,null, false),当前对象为StandardContext,有3listeners

1)、ContextConfig,进入beforeStart()方法,调用antiLocking();判断条件antiResourceLocking,结果为false,没有去执行。

2)、MemoryLeakTrackingListener,在此阶段没动作

3)、TldConfig,在此阶段没动作

6startInternal(),为StandardContextstartInternal()方法。

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,设置partnerClassLoadersharedLoader

    2)、设置delegatefalse

    3)、设置loader

6)、getCharsetMapper(),设置charsetMapper

7)、postWorkDirectory(),设置工作目录,为work\Catalina\localhost\docs,设置了ApplicationContextcontext

8),进行检查,Web Application

9)、增加一个StandardContextlslistenerNamingContextListener

10)、当前线程与DirContext进行绑定,这里返回一个classLoader。其中bindThread()unbindThread(oldCCL)主要是进行当前线程的classLoader切换。加载应用的和当前类。

11)、loader进行start,后续介绍

12)、fireLifecycleEvent(Lifecycle.CONFIGURE_START_EVENT, null); StandardContextls4listeners4listenersconfigure_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中设置InstanceManagerkv,具体内容后续介绍。



 

19)、DedicatedThreadExecutor temporaryExecutor = new DedicatedThreadExecutor();创建一个线程池。

20)、在servlet context中设置JarScannerkv

21)、mergeParameters();

22)、用线程池运行listenerStart()任务。在StandardContext

23)、StandardManager.start,后续介绍

24)、super.threadStart(),调用父类ContainerBasethreadStart方法。

25)、用线程池运行filterStart()任务。Filterinit方法。

26)、loadOnStartup(findChildren())的启动。里面用的treeMap对等级排序,然后启动,代码如下。调用serlvetinit方法。



 

27)、setState(LifecycleState.STARTING)StandardContextls4listeners

    1)、ContextConfig,在此阶段没动作。

    2)、MemoryLeakTrackingListener,在此阶段没动作。

    3)、TldConfig,在此阶段没动作。

    4)、NamingContextListener,在此阶段没动作。

7setStateInternal(LifecycleState.STARTED, null, false)StandardContextls4listeners

1)、ContextConfig,在此阶段没动作。

2)、MemoryLeakTrackingListener,在after_start状态下,设置childClassLoaders.put(context.getLoader().getClassLoader(),context.getServletContext().getContextPath());其中key= WebappClassLoadervalue= /docs

3)、TldConfig,在此阶段没动作。

4)、NamingContextListener,在此阶段没动作。

猜你喜欢

转载自83519144.iteye.com/blog/1887001