前言
SpringMVC定位於一個較為鬆散的組合,展示給使用者的檢視(View)、控制器返回的資料模型(Model)、定位檢視的檢視解析器(ViewResolver)和處理介面卡(HandlerAdapter)等容器都是獨立的。換句話說,通過SpringMVC很容易把後臺的資料轉換為各種型別的資料,以滿足移動網際網路資料多樣化的要求。
本篇僅為簡單介紹SpringMVC的大致元件與流程,詳細過程將在後續篇章一一道來。
1. SpringMVC框架的設計與流程
流程和元件是SpringMVC的核心,SpringMVC的流程是圍繞DispatcherServlet而工作的。
1.1 SpringMVC框架的示意圖
1.2 SpringMVC的元件流程
大致流程是:首先是定義請求分發,讓SpringMVC能夠產生HandlerMapping
;其次是接收請求獲取引數;再次是處理業務邏輯獲取資料模型ModelAndView
;最後是繫結檢視和資料模型。
以上元件將會在後續文章講解,這裡僅做一個大概介紹。
元件名稱 | 元件說明 |
---|---|
DispatcherServlet | 核心元件,前端控制器; |
LocalResolver | 國際化解析器; |
ThemeResolver | 主體解析器; |
HandlerMapping | 處理器對映; |
HandlerAdapter | 處理器介面卡; |
HandlerExceptionResolver | 處理器異常解析器; |
RequestToViewNameTranslator | 策略檢視名稱轉換器; |
ViewResolver | 檢視解析器; |
FalshMapManager | 不常用,FlashMap管理; |
以上元件會在SpringMVC初始化時構建出來。
2. *自動配置的原始碼分析
SpringMVC的自動配置流程是類似第三章了資料庫元件自動配置相關內容。
2.1 匯入Web場景啟動器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.2 找到DispatcherServlet的屬性檔案
前面提到SpringMVC的核心是DispatcherServlet
前端控制器,因此我們找到它的屬性檔案DispatcherServlet.properties
:
它定義的物件在SpringMVC開始時就初始化,並且註冊進Spring IoC容器中。此外,在這個jar包內定義了很多SpringMVC相關的元件。
3. 自動配置的官網描述
SpringBoot配置SpringMVC在SpringBoot官網已經說明了,可以參考以下翻譯。
官網地址:7.1.1. Spring MVC Auto-configuration
Spring Boot provides auto-configuration for Spring MVC that works well with most applications.(SpringBoot為SpringMVC提供了自動配置,因此大多場景我們都無需自定義配置)
The auto-configuration adds the following features on top of Spring’s defaults:
(自動化配置包括以下預設特性)
-
Inclusion of
ContentNegotiatingViewResolver
andBeanNameViewResolver
beans.- 內容協商檢視解析器和BeanName檢視解析器;
-
Support for serving static resources, including support for WebJars (covered later in this document)).
- 靜態資源(包括webjars);
-
Automatic registration of
Converter
,GenericConverter
, andFormatter
beans.- 自動註冊 Converter,GenericConverter,Formatter;
-
Support for
HttpMessageConverters
(covered later in this document).- 支援 HttpMessageConverters(後續文章有內容協商原理分析);
-
Automatic registration of
MessageCodesResolver
(covered later in this document).- 自動註冊 MessageCodesResolver (國際化用,少用,一般直接開發兩套頁面);
-
Static
index.html
support.- 靜態index.html 頁支援;
-
Custom
Favicon
support (covered later in this document).- 自定義Favicon;
-
Automatic use of a
ConfigurableWebBindingInitializer
bean (covered later in this document).- 自動使用 ConfigurableWebBindingInitializer,(DataBinder負責將請求資料繫結到JavaBean上);
If you want to keep those Spring Boot MVC customizations and make more MVC customizations (interceptors, formatters, view controllers, and other features), you can add your own
@Configuration
class of typeWebMvcConfigurer
but without@EnableWebMvc
.不用@EnableWebMvc註解。使用@Configuration+WebMvcConfigurer自定義規則;
If you want to provide custom instances of
RequestMappingHandlerMapping
,RequestMappingHandlerAdapter
, orExceptionHandlerExceptionResolver
, and still keep the Spring Boot MVC customizations, you can declare a bean of typeWebMvcRegistrations
and use it to provide custom instances of those components.宣告WebMvcRegistrations改變預設底層元件;
If you want to take complete control of Spring MVC, you can add your own
@Configuration
annotated with@EnableWebMvc
, or alternatively add your own@Configuration
-annotatedDelegatingWebMvcConfiguration
as described in the Javadoc of@EnableWebMvc
.使用@EnableWebMvc+@Configuration+DelegatingWebMvcConfiguration 全面接管SpringMVC;
4. 定製SpringMVC的初始化
Spring提供WebMvcConfigurer介面;對應SpringBoot提供WebMvcAutoConfiguration介面。
4.1 WebMvcConfigurer與WebMvcAutoConfiguration的關係圖
在SpringBoot中,自定義通過配置類WebMvcAutoConfiguration
定義的,它有一個靜態的內部類WebMVCAutoConfigurationAdapter
,通過它SpringBoot就自動配置了SpringMVC的初始化。
4.2 SpringMVC可配置項
在WebMVCAutoConfigurationAdapter
類中,它會讀入Spring配置SpringMVC的屬此來初始化對應元件,這樣便能夠在一定程度上實現自定義。可配置項如下:
除此之外,還可以實現WebMvcConfigurer
介面加入自己定義的方法。