中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行Spring源代碼解析IoC容器在Web容器中的啟動

發布時間:2021-12-02 16:29:44 來源:億速云 閱讀:176 作者:柒染 欄目:大數據

這篇文章給大家介紹如何進行Spring源代碼解析IoC容器在Web容器中的啟動,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

在web容器中,通過ServletContext為Spring的IOC容器提供宿主環境,對應的建立起一個IOC容器的體系。其中,首先需要建立的是根上下文,這個上下文持有的對象可以有業務對象,數據存取對象,資源,事物管理器等各種中間層對象。在這個上下文的基礎上,和web MVC相關還會有一個上下文來保存控制器之類的MVC對象,這樣就構成了一個層次化的上下文結構。在web容器中啟動Spring應用程序就是一個建立這個上下文體系的過程。Spring為web應用提供了上下文的擴展接口 
WebApplicationContext: 

Java代碼

如何進行Spring源代碼解析IoC容器在Web容器中的啟動

而一般的啟動過程,Spring會使用一個默認的實現,XmlWebApplicationContext - 這個上下文實現作為在web容器中的根上下文容器被建立起來,具體的建立過程在下面我們會詳細分析。 

Java代碼

如何進行Spring源代碼解析IoC容器在Web容器中的啟動

對于一個Spring激活的web應用程序,可以通過使用Spring代碼聲明式的指定在web應用程序啟動時載入應用程序上下文(WebApplicationContext),Spring的ContextLoader是提供這樣性能的類,我們可以使用 ContextLoaderServlet或者ContextLoaderListener的啟動時載入的Servlet來實例化Spring IOC容器 - 為什么會有兩個不同的類來裝載它呢,這是因為它們的使用需要區別不同的Servlet容器支持的Serlvet版本。但不管是 ContextLoaderSevlet還是 ContextLoaderListener都使用ContextLoader來完成實際的WebApplicationContext的初始化工作。這個ContextLoder就像是Spring Web應用程序在Web容器中的加載器booter。當然這些Servlet的具體使用我們都要借助web容器中的部署描述符來進行相關的定義。 
下面我們使用ContextLoaderListener作為載入器作一個詳細的分析,這個Servlet的監聽器是根上下文被載入的地方,也是整個 Spring web應用加載上下文的第一個地方;從加載過程我們可以看到,首先從Servlet事件中得到ServletContext,然后可以讀到配置好的在web.xml的中的各個屬性值,然后ContextLoder實例化WebApplicationContext并完成其載入和初始化作為根上下文。當這個根上下文被載入后,它被綁定到web應用程序的ServletContext上。任何需要訪問該ApplicationContext的應用程序代碼都可以從WebApplicationContextUtils類的靜態方法來得到: 

Java代碼  如何進行Spring源代碼解析IoC容器在Web容器中的啟動

  1. WebApplicationContext getWebApplicationContext(ServletContext sc)  


以Tomcat作為Servlet容器為例,下面是具體的步驟: 
1.Tomcat 啟動時需要從web.xml中讀取啟動參數,在web.xml中我們需要對ContextLoaderListener進行配置,對于在web應用啟動入口是在ContextLoaderListener中的初始化部分;從Spring MVC上看,實際上在web容器中維護了一系列的IOC容器,其中在ContextLoader中載入的IOC容器作為根上下文而存在于 ServletContext中。 

Java代碼

如何進行Spring源代碼解析IoC容器在Web容器中的啟動

通過ContextLoader建立起根上下文的過程,我們可以在ContextLoader中看到: 

Java代碼

如何進行Spring源代碼解析IoC容器在Web容器中的啟動

建立根上下文的父上下文使用的是下面的代碼,取決于在web.xml中定義的參數:locatorFactorySelector,這是一個可選參數: 

Java代碼

如何進行Spring源代碼解析IoC容器在Web容器中的啟動

得到根上下文的父上下文以后,就是根上下文的創建過程: 

Java代碼

如何進行Spring源代碼解析IoC容器在Web容器中的啟動

初始化根ApplicationContext后將其存儲到SevletContext中去以后,這樣就建立了一個全局的關于整個應用的上下文。這個根上下文會被以后的DispatcherServlet初始化自己的時候作為自己ApplicationContext的父上下文。這個在對 DispatcherServlet做分析的時候我們可以看看到。 

3.完成對ContextLoaderListener的初始化以后, Tomcat開始初始化DispatchServlet,- 還記得我們在web.xml中隊載入次序進行了定義。DispatcherServlet會建立自己的ApplicationContext,同時建立這個自己的上下文的時候會從ServletContext中得到根上下文作為父上下文,然后再對自己的上下文進行初始化,并最后存到 ServletContext中去供以后檢索和使用。 
可以從DispatchServlet的父類FrameworkServlet的代碼中看到大致的初始化過程,整個ApplicationContext的創建過程和ContextLoder創建的過程相類似: 

Java代碼

如何進行Spring源代碼解析IoC容器在Web容器中的啟動

對initWebApplicationContext()調用的代碼如下: 

Java代碼

如何進行Spring源代碼解析IoC容器在Web容器中的啟動

其中我們看到調用了WebApplicationContextUtils的靜態方法得到根ApplicationContext: 

Java代碼

如何進行Spring源代碼解析IoC容器在Web容器中的啟動

4. 然后就是DispatchServlet中對Spring MVC的配置過程,首先對配置文件中的定義元素進行配置 - 請注意這個時候我們的WebApplicationContext已經建立起來了,也意味著DispatcherServlet有自己的定義資源,可以需要從web.xml中讀取bean的配置信息,通常我們會使用單獨的xml文件來配置MVC中各個要素定義,這里和web容器相關的加載過程實際上已經完成了,下面的處理和普通的Spring應用程序的編寫沒有什么太大的差別,我們先看看MVC的初始化過程: 

Java代碼

如何進行Spring源代碼解析IoC容器在Web容器中的啟動

5. 這樣MVC的框架就建立起來了,DispatchServlet對接受到的HTTP Request進行分發處理由doService()完成,具體的MVC處理過程我們在doDispatch()中完成,其中包括使用Command模式建立執行鏈,顯示模型數據等,這些處理我們都可以在DispatcherServlet的代碼中看到: 

Java代碼

如何進行Spring源代碼解析IoC容器在Web容器中的啟動

實際的請求分發由doDispatch(request,response)來完成: 

Java代碼

如何進行Spring源代碼解析IoC容器在Web容器中的啟動

這樣具體的MVC模型的實現就由bean配置文件里定義好的view resolver,handler這些類來實現用戶代碼的功能。 
總結上面的過程,我們看到在web容器中,ServletContext可以持有一系列的web上下文,而在整個web上下文中存在一個根上下文來作為其它 Servlet上下文的父上下文。這個根上下文是由ContextLoader載入并進行初始化的,對于我們的web應用, DispatcherSerlvet載入并初始化自己的上下文,這個上下文的父上下文是根上下文,并且我們也能從ServletContext中根據 Servlet的名字來檢索到我們需要的對應于這個Servlet的上下文,但是根上下文的名字是由Spring唯一確定的。這個 DispactcherServlet建立的上下文就是我們開發Spring MVC應用的IOC容器。 

關于如何進行Spring源代碼解析IoC容器在Web容器中的啟動就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

肃北| 团风县| 南平市| 连州市| 博客| 临潭县| 石家庄市| 喀喇| 呼图壁县| 临沧市| 黄平县| 惠东县| 凤阳县| 响水县| 若羌县| 岳池县| 土默特左旗| 修文县| 克山县| 巧家县| 临颍县| 普安县| 大同县| 西乌珠穆沁旗| 彰化县| 铁力市| 大余县| 沙田区| 泽州县| 涟水县| 唐河县| 新密市| 沁阳市| 义马市| 嵊州市| 南开区| 卢龙县| 延川县| 荔浦县| 新建县| 屏东市|