<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SpringMVC的啟動(dòng)過程

          共 2146字,需瀏覽 5分鐘

           ·

          2020-04-23 23:21


          本文公眾號(hào)來源:編程新說作者:編程新說李新杰本文已收錄至我的GitHub

          打成war包并放入Tomcat等Servlet容器下面運(yùn)行的,都認(rèn)為是SpringMVC傳統(tǒng)的啟動(dòng)方式。

          和SpringBoot連用且采用內(nèi)嵌Web服務(wù)器并打成
          jar包直接運(yùn)行的,可以認(rèn)為是SpringMVC現(xiàn)代的啟動(dòng)方式。

          傳統(tǒng)的啟動(dòng)過程

          基于web.xml(配置文件)的方式啟動(dòng)肯定算傳統(tǒng)的,但由于現(xiàn)在web.xml幾乎已經(jīng)絕跡,所以就不考慮它了。

          與之相對(duì)的就是基于編程(寫代碼)的方式啟動(dòng),流行于前幾年的
          SSM(Spring、SpringMVC、MyBatis)中。當(dāng)然也算傳統(tǒng)的。

          通過一個(gè)“
          小橋式”的接口ServletContainerInitializer(Servlet容器初始化器)把Tomcat的啟動(dòng)和初始化進(jìn)程帶到了SpringMVC里。

          在這個(gè)“橋式”接口上可以指定“感興趣”的類或接口,SpringMVC指定的是
          WebApplicationInitializer(Web應(yīng)用初始化器)接口,意圖已經(jīng)很明顯,就是通過這個(gè)初始化器接口來完成SpringMVC應(yīng)用的啟動(dòng)和初始化。

          我們先來看下這個(gè)初始化接口,如下圖01:

          759cc307f4c1032f60e60c8586d6c6d9.webp


          它只有一個(gè)onStartup方法,方法只有一個(gè)參數(shù)就是ServletContext,這個(gè)ServletContext由Tomcat創(chuàng)建好后提供給SpringMVC,SpringMVC在啟動(dòng)過程中調(diào)用這個(gè)onStartup方法,在這個(gè)方法內(nèi)完成自身的創(chuàng)建和初始化,還要把Servlet和Filter等注冊(cè)到ServletContext里。

          這些工作都是SpringMVC要做的,而不是我們要做的,所以SpringMVC肯定已經(jīng)實(shí)現(xiàn)了這個(gè)接口,我們查看下類型信息,如下圖02:

          df4811f531b75a8f5f0c13b99195a809.webp


          我們發(fā)現(xiàn)了一個(gè)看著很重要的類,就是:

          AbstractAnnotationConfigDispatcherServletInitializer

          可惜這個(gè)類是抽象的,肯定是不能直接用的,但是它里面已經(jīng)包含了剛剛上面提到的所有完整的啟動(dòng)邏輯過程。

          如果你對(duì)SSM很熟悉或Spring的
          官方文檔看的很熟悉的話,你一定知道這個(gè)類是怎么用的。是的,我們需要定義一個(gè)類來繼承它即可。

          先看下官方文檔上給的用法,如下圖03:

          327cfaed8942b4bfd2dbc5c75e3c8baa.webp


          繼承之后,我們需要提供三方面信息,一個(gè)是用于注冊(cè)到根容器中的類,一個(gè)是用于注冊(cè)到Servlet容器中的類,一個(gè)是核心Servlet的映射URL。

          注意,這里說的容器指的是Spring的ApplicationContext這個(gè)容器,其中根容器和Servlet容器是父子關(guān)系,且在SpringMVC中核心Servlet映射的URL必須是“/”。

          下面給出一個(gè)我在幾年前為公司搭建框架時(shí)的代碼,如下圖04:

          cc14e04f21d9c23439556b34183b3e8e.webp


          這就是以編程的方式來完成SpringMVC的啟動(dòng)。我們自己定義的這個(gè)類就是前文提到的“感興趣”的類。

          這個(gè)類是
          不用(或不能)向Spring容器注冊(cè)的,因?yàn)檫@個(gè)類是感興趣的類,所以Tomcat會(huì)從jar包里把它找出來,這樣SpringMVC就拿到了我們定義的這個(gè)類。

          其實(shí)最主要的是這時(shí)候根本還沒有Spring容器呢,哈哈,因?yàn)镾pring容器就是在這個(gè)類里才創(chuàng)建出來的,有點(diǎn)意思吧。

          其實(shí)這個(gè)類里包含的內(nèi)容非常多,我們都可以使用寫代碼的方式來進(jìn)行配置。下面舉幾個(gè)示例。

          比如對(duì)
          核心Servlet的一些定制化設(shè)置,如下圖05:

          e5fa449503f0e39d806eee3506033fa9.webp


          比如可以加進(jìn)去一些自己需要的過濾器,如下圖06:

          987dca7c5dddd2a71c7b574f64cf520a.webp


          比如可以對(duì)文件上傳進(jìn)行一些配置,如下圖07:

          4fd50f5a7f7ee2917038e16a88804da9.webp


          當(dāng)然,還可以介入到Spring容器的初始化過程中,進(jìn)行一些額外的操作,如激活特定的Profile等,如下圖08:

          229b54d70ef47641414d019a9f7638dc.webp



          啟動(dòng)過程中做的事情

          其實(shí)前面已經(jīng)說了一些了,這里再來個(gè)完整版的,主要包括的事情有:

          1、創(chuàng)建根容器。

          2、然后把根容器放入ServletContext中。

          3、接著創(chuàng)建Servlet容器。

          4、然后使用Servlet容器去創(chuàng)建核心Servlet。

          5、接著把核心Servlet注冊(cè)到ServletContext中。

          6、接著再注冊(cè)一些過濾器。

          下面我們使用幾張圖把這些內(nèi)容一個(gè)個(gè)展示一下,需要詳細(xì)了解的可以去看看對(duì)應(yīng)的源碼。

          創(chuàng)建根容器,可以看到是基于注解的容器類,如下圖09:

          fef5bb662d44104e55f56eaf8de4e28f.webp


          將根容器放入ServletContext中,因?yàn)镾ervletContext在應(yīng)用運(yùn)行期間一直存在,所以根容器是一個(gè)全局性的,也一直存在,如下圖10:

          71fe6c9949f1f0addbee0094701a39a6.webp


          創(chuàng)建Servlet容器,容器類也是基于注解的,和根容器類是一樣的,如下圖11:

          67ac27ead7c08eac5590dbeefe785a67.webp


          使用Servlet容器去創(chuàng)建核心Servlet,如下圖12:

          db7e5ce0b99a58dc4cf8c0ebbbe27061.webp


          把核心Servlet注冊(cè)到ServletContext中,如下圖13:

          8f6df50e5e2a55b35ac923a0472ea75b.webp


          最后就是注冊(cè)一些過濾器了,如下圖14:

          73dd8a68f63374809cd8a726e25d2a6c.webp


          建議做Java開發(fā)且渴望優(yōu)秀的朋友一定要把這些東西搞清楚。


          ??各類知識(shí)點(diǎn)總結(jié)

          下面的文章都有對(duì)應(yīng)的原創(chuàng)精美PDF,在持續(xù)更新中,可以來找我催更~

          掃碼或者微信搜Java3y?免費(fèi)領(lǐng)取原創(chuàng)思維導(dǎo)圖、精美PDF。在公眾號(hào)回復(fù)「888」領(lǐng)取,PDF內(nèi)容純手打有任何不懂歡迎來問我。

          原創(chuàng)電子書
          8f5dc5c6066c4c00c8c93766cb8e6710.webp

          原創(chuàng)思維導(dǎo)圖

          684e7581ffe1e93da9a60e433ed8af16.webp


          3c5d32ca28d2c2517e57cbc4ea76501a.webp

          92d95ad090f9a0d7e311716cf5c6e00a.webp

          92d95ad090f9a0d7e311716cf5c6e00a.webp

          瀏覽 109
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青草偷拍视频 | 亚洲三级片免费手机网站 | 国产视频福利在线 | 在线成人免费视频 | 男人的天堂网站视频 |