Spring MVC中的Web.XML會配置兩個類ContextLoaderListener和DispatchServlet摧莽。
先看一下ServletContextListener指煎。
ServletContextListener實(shí)現(xiàn)了ServletContextListener接口嗜历,ServletContextListener是Servlet API中的接口义锥,可以監(jiān)聽Servlet容器比如Tomcat的生命周期嵌纲,初始化(contextInitialized方法)和銷毀階段(contextDestroyed方法)朱转。這樣在Servlet容器啟動的時候就會調(diào)用ContextLoaderListener的contextInitialized?方法准谚。
initWebApplicationContext方法在父類ContextLoader中實(shí)現(xiàn)
先判斷ServletContext中是否有了該屬性谦炒,如果有拋異常贯莺,只能有一個實(shí)例。
createWebApplicationContext根據(jù)web.xml配置的contextClass屬性實(shí)例化一個WebApplicationContext的子類宁改,沒有配的話從目錄下ContextLoader.properties里查找默認(rèn)為:
org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext缕探,這個是下面提到的ROOT容器。
如果ROOT容器沒有父容器还蹲,那么通過loadParentContext方法去加載配置的父容器爹耗,(需要兩個參數(shù)locatorFactorySelector和parentContextKey)。
最后刷新容器configureAndRefreshWebApplicationContext
最開始設(shè)置ID谜喊,獲取配置文件地址
customizeContext是可擴(kuò)展的操作
通過determineContextInitializerClasses方法獲取配置的ApplicationContextInitializer子類
globalInitializerClasses代表所有的web application都會應(yīng)用
contextInitializerClasses代表只有當(dāng)前的web application會使用
這些實(shí)現(xiàn)類作為一個集合鲸沮,轉(zhuǎn)化為class類型,并實(shí)例化對象锅论,添加到contextInitializers中讼溺。通過AnnotationAwareOrderComparator通過ApplicationContextInitializer的Order注解排序。
最后調(diào)用ApplicationContextInitializer的initialize方法最易。
可以在這里改變?nèi)萜鞯膶傩浴?/p>
最后刷新容器包括:
啟動DefaultListBeanFactory怒坯,加載配置文件,加載BeanFactoryPostProcessor并調(diào)用其方法藻懒,初始化BeanPostProcessor,初始化事件廣播和監(jiān)聽剔猿,以及發(fā)布啟動時間等
給Servlet配置關(guān)聯(lián)容器的屬性
最后獲取當(dāng)前線程的上下文類加載器
看是否是當(dāng)前ContextLoader的類加載器
如果是說明Web和Spring放一起用的都是一個ClassLoader
否則需要把當(dāng)前現(xiàn)成的上下文類加載器和容器相映射。