摘要:當(dāng)容器啟動(dòng)或終止應(yīng)用時(shí),會(huì)觸發(fā)事件,該事件由來(lái)處理。監(jiān)聽(tīng)器的作用就是啟動(dòng)容器時(shí),自動(dòng)裝配的配置信息。初始化在架構(gòu)中,負(fù)責(zé)請(qǐng)求分發(fā),起到控制器的作用。
??公司項(xiàng)目使用 struts2 作為控制層框架,為了實(shí)現(xiàn)前后端分離,計(jì)劃將 struts2 切換為 SpringMVC ,因此,這段時(shí)間都在學(xué)習(xí)新的框架,《Spring實(shí)戰(zhàn)》是一本好書,里面對(duì) Spring 的原理實(shí)現(xiàn)以及應(yīng)用都說(shuō)得很透徹,強(qiáng)烈推薦,但是如果想深挖 Spring 的實(shí)現(xiàn),還是要從他的源碼入手,這次,就先從 SpringMVC 初始化開(kāi)始。
Web 容器初始化過(guò)程
SpringMVC的Web.xml配置
DispatchServlet初始化
Web容器初始化過(guò)程web容器初始化的過(guò)程,其官方文檔給出了這樣的描述:
Instantiate an instance of each event listener identified by a
For instantiated listener instances that implement ServletContextListener, call the contextInitialized() method.
Instantiate an instance of each filter identified by a
Instantiate an instance of each servlet identified by a
其初始化的過(guò)程實(shí)際如下:
web.xml 配置代碼:
contextConfigLocation classpath:applicationContext.xml org.springframework.web.context.ContextLoaderListener mvc-dispatcher org.springframework.web.servlet.DispatcherServlet 1 mvc-dispatcher /
??在 Servlet API中有一個(gè)ServletContextListener接口,它能夠監(jiān)聽(tīng)ServletContext對(duì)象的生命周期,實(shí)際上就是監(jiān)聽(tīng)Web應(yīng)用的生命周期。當(dāng)Servlet容器啟動(dòng)或終止Web應(yīng)用時(shí),會(huì)觸發(fā)ServletContextEvent事件,該事件由ServletContextListener來(lái)處理。在ServletContextListener接口中定義了處理ServletContextEvent 事件的兩個(gè)方法contextInitialized()和contextDestroyed()。
??ContextLoaderListener監(jiān)聽(tīng)器的作用就是啟動(dòng)Web容器時(shí),自動(dòng)裝配ApplicationContext的配置信息。因?yàn)樗鼘?shí)現(xiàn)了ServletContextListener這個(gè)接口,在web.xml配置了這個(gè)監(jiān)聽(tīng)器,啟動(dòng)容器時(shí),就會(huì)默認(rèn)執(zhí)行它實(shí)現(xiàn)的方法。由于在ContextLoaderListener中關(guān)聯(lián)了ContextLoader這個(gè)類,所以整個(gè)加載配置過(guò)程由ContextLoader來(lái)完成。
DispatchServlet初始化在SpringMVC架構(gòu)中,DispatchServlet負(fù)責(zé)請(qǐng)求分發(fā),起到控制器的作用。下面詳細(xì)來(lái)解釋說(shuō)明:
DispatchServlet名如其義,它的本質(zhì)上是一個(gè)Servlet,子類不斷的對(duì)HttpServlet父類進(jìn)行方法擴(kuò)展
HttpServlet有兩大核心方法:init()和service()方法。HttpServletBean重寫了init()方法,在這部分,我們可以看到其實(shí)現(xiàn)思路:公共的部分統(tǒng)一來(lái)實(shí)現(xiàn),變化的部分統(tǒng)一來(lái)抽象,交給其子類來(lái)實(shí)現(xiàn),故用了abstract class來(lái)修飾類名。此外,HttpServletBean提供了一個(gè)HttpServlet的抽象實(shí)現(xiàn),使的Servlet不再關(guān)心init-param部分的賦值,讓servlet更關(guān)注于自身Bean初始化的實(shí)現(xiàn)
FrameworkServlet提供了整合web javabean和spring application context的整合方案。在源碼中可以看到通過(guò)執(zhí)行initWebApplicationContext()方法和initFrameworkServlet()方法實(shí)現(xiàn)
DispatchServlet是HTTP請(qǐng)求的中央調(diào)度處理器,它將web請(qǐng)求轉(zhuǎn)發(fā)給controller層處理,它提供了敏捷的映射和異常處理機(jī)制,DispatchServlet轉(zhuǎn)發(fā)請(qǐng)求的核心代碼在doService()方法中實(shí)現(xiàn)
DispatchServlet類和ContextLoaderListener類的關(guān)系圖:
用ContextLoaderListener初始化上下文,接著使用DispatchServlet來(lái)初始化WebMVC的上下文
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/67387.html
摘要:?jiǎn)栴}來(lái)了,我們到底還在用嗎答案是,不全用。后者是初始化的配置,主要是的配置。啟動(dòng)類測(cè)試啟動(dòng)項(xiàng)目后,在瀏覽器里面輸入。通過(guò)查詢已裝載的,并且支持該而獲取的。按照前面對(duì)的描述,對(duì)于而言,這個(gè)必定是。的核心在的方法中。 之前已經(jīng)分析過(guò)了Spring的IOC(《零基礎(chǔ)帶你看Spring源碼——IOC控制反轉(zhuǎn)》)與AOP(《從源碼入手,一文帶你讀懂Spring AOP面向切面編程》)的源碼,本次...
摘要:環(huán)境要求使用純來(lái)搭建環(huán)境,要求的版本必須在以上。即視圖解析器解析文件上傳等等,如果都不需要配置的話,這樣就可以了。可以將一個(gè)字符串轉(zhuǎn)為對(duì)象,也可以將一個(gè)對(duì)象轉(zhuǎn)為字符串,實(shí)際上它的底層還是依賴于具體的庫(kù)。中,默認(rèn)提供了和的,分別是和。 在 Spring Boot 項(xiàng)目中,正常來(lái)說(shuō)是不存在 XML 配置,這是因?yàn)?Spring Boot 不推薦使用 XML ,注意,并非不支持,Spring...
摘要:核心類類的繼承關(guān)系前端控制器是規(guī)范中的核心類,實(shí)現(xiàn)接口,繼承此類用于處理用戶請(qǐng)求。主要配置中初始化參數(shù)。 Spring MVC 核心類 類的繼承關(guān)系Spring MVC前端控制器DispatcherServlet-->FrameworkServlet-->HttpServletBean-->HttpServletshowImg(https://segmentfault.com/img/...
摘要:接口接口作用是將請(qǐng)求映射到處理程序,以及預(yù)處理和處理后的攔截器列表,映射是基于一些標(biāo)準(zhǔn)的,其中的細(xì)節(jié)因不同的實(shí)現(xiàn)而不相同。該參數(shù)是類型,作用是檢查所有的映射解析器或使用或?yàn)榈模J(rèn)為,即從上下文中檢查所有的。 概述 在Spring MVC啟動(dòng)章節(jié)https://segmentfault.com/a/1190000014674239,介紹到了DispatcherServlet的onRef...
摘要:概述用久了,深受其約定大于配置的便利性毒害之后,我想回歸到時(shí)代,看看開(kāi)發(fā)模式中用戶是如何參與的。備注當(dāng)然本文所使用的全是非注解的配置方法,即需要在中進(jìn)行配置并且需要遵循各種實(shí)現(xiàn)原則。而更加通用主流的基于注解的配置方法將在后續(xù)文章中詳述。 showImg(https://segmentfault.com/img/remote/1460000015244684); 概述 用久了Sprin...
閱讀 1155·2021-11-24 10:43
閱讀 3112·2021-11-22 09:34
閱讀 3553·2021-10-08 10:04
閱讀 3936·2021-09-23 11:58
閱讀 3119·2019-08-30 15:44
閱讀 489·2019-08-30 13:01
閱讀 1163·2019-08-28 18:07
閱讀 1452·2019-08-26 13:42