本節書摘來自異步社群《精通spring mvc 4》一書中的第1章,第1.6節,作者:【美】geoffroy warin著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
如果你之前搭建過spring mvc應用,那麼可能已經習慣于編寫相關的xml檔案或java注解配置類。
一般來講,初始的步驟如下所示:
1.初始化spring mvc的dispatcherservlet;
2.搭建轉碼過濾器,保證用戶端請求進行正确地轉碼;
3.搭建視圖解析器(view resolver),告訴spring去哪裡查找視圖,以及它們是使用哪種方言編寫的(jsp、thymeleaf模闆等);
4.配置靜态資源的位置(css、js);
5.配置所支援的地域以及資源bundle;
6.配置multipart解析器,保證檔案上傳能夠正常工作;
7.将tomcat或jetty包含進來,進而能夠在web伺服器上運作我們的應用;
8.建立錯誤頁面(如404)。
不過,spring boot為我們處理了所有的事情。因為這些配置一般是與應用相關的,是以你可以無限制地将它們進行組合。
在一定程度上來講,spring boot是帶有一定傾向性的spring項目配置器。它基于約定,并且預設會在你的項目中使用這些約定。
1.6.1 分發器和multipart配置
接下來,讓我們看一下在幕後到底發生了什麼。
我們使用預設生成的spring boot配置檔案,并将其設定為debug模式。在src/main/resources/ application.properties中添加下面這一行:
<code>debug=true</code>
現在,如果重新啟動應用的話,就能看到spring boot的自動配置報告。它分為兩部分:一部分是比對上的(positive matches),列出了應用中,所有的自動配置,另一部分是沒有比對上的(negative matches),這部分是應用在啟動的時候,需求沒有滿足的spring boot自動配置:
仔細看一下dispatcherservletautoconfiguration:
這是一個典型的spring boot配置類。
與其他的spring配置類相同,它使用了@configuration注解;
一般會通過@order注解來聲明優先等級,可以看到dispatcherservletautoconfiguration需要優先進行配置;
其中也可以包含一些提示資訊,如@autoconfigureafter或@autoconfigurebefore,進而進一步細化配置處理的順序;
它還支援在特定的條件下啟用某項功能。通過使用@conditionalonclass (dispatcherservlet.class)這個特殊的配置,能夠確定我們的類路徑下包含dispatcherservlet,這能夠很好地表明spring mvc位于類路徑中,使用者目前希望将其啟動起來。
這個檔案中還包含了spring mvc分發器servlet和multipart解析器的典型配置。整個spring mvc配置被拆分到了多個檔案之中。
另外,值得一提的是,這些bean會遵循特定的規則,以此來檢查是否處于激活狀态。在@conditional(defaultdispatcherservletcondition.class)條件滿足的情況下,servletregistrationbean函數才會啟用,這有些複雜,但是能夠檢查在你的配置中,是否已經注冊了分發器servlet。
隻有在滿足@conditionalonmissingbean(name=dispatcherservlet.multipart_resolver_ bean_name)條件的情況下,multipartresolver函數才會處于激活狀态,例如,當我們自己還沒有注冊的時候。
這意味着spring boot僅僅是基于常見的使用場景,幫助我們對應用進行配置。不過,可以在任意的地方覆寫這些預設值,并聲明自己的配置。
是以,通過檢視dispatcherservletautoconfiguration,就了解了為什麼我們已經擁有了分發器servlet和multipart解析器。
1.6.2 視圖解析器、靜态資源以及區域配置
另外一個密切相關的配置是webmvcautoconfiguration,它聲明了視圖解析器、地域解析器(localeresolver)以及靜态資源的位置。視圖解析器如下所示:
視圖解析器的配置并沒有什麼特殊之處,這裡真正有意思的是使用了配置屬性,進而允許使用者對其進行自定義。
它的意思就是說“将會在使用者的application.properties檔案中查找兩個變量,這兩個變量的名字是spring.view.prefix和spring.view.suffix”。在配置中隻需兩行代碼就能将視圖解析器搭建起來了,這是非常便利的。
為了下一章内容的講解,你需要牢記這一點,不過,我們現在會繼續浏覽spring boot的代碼。
關于靜态資源,配置中包含了如下的内容:
資源位置的聲明有點複雜,但是通過它,我們可以了解到以下兩點:
對帶有“webjar”字首的資源通路将會在類路徑中解析。這樣的話,我們就能使用mavan中央倉庫中預先打包好的javascript依賴;
我們的靜态資源需要放在類路徑中,并且要位于以下4個目錄中的任意一個之中,“/meta-inf/resources/”“/resources/”“/static/”或“/public/”。

webjars是jar包格式的用戶端javascript庫,可以通過maven中央倉庫來擷取。它們包含了maven項目檔案,這個檔案允許定義傳遞性依賴,能夠用于所有基于jvm的應用之中。webjars是javascript包管理器的替代方案,如bower或npm。對于隻需要較少javascript庫的應用來說,這種方案是很棒的。你可以在www.webjars.org站點上看到所有可用的webjars清單。
在這個檔案中,還專門有一部分用來聲明地域管理:
預設的地域解析器隻會處理一個地域,并且允許我們通過spring.mvc.locale配置屬性來進行定義。