读书人

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

发布时间: 2013-07-08 14:13:00 作者: rapoo

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

(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,通过第六章第三小节注入。

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

?

????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。

如下图

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

其中getResouces为如下图。

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

(17)、设置mapper属性,mapper.setContext(getPath(),welcomeFiles,?resources);

(18)、在servlet?context中设置InstanceManager的kv,具体内容后续介绍。

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

(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方法。

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

(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,在此阶段没动作。

读书人网 >开源软件

热点推荐