javascript
Spring Boot 管理 MVC
一、Spring MVC 自動配置
Spring Boot 為 Spring MVC 應用提供了自動配置。主要包括視圖解析器、靜態資源處理、類型轉化器與格式化器、HTTP 消息轉換器、靜態主頁的支持等。
Spring MVC 自動配置是通過 WebMvcAutoConfiguration 類實現的,如果你去看這個類的源碼,一定會發現很多熟悉的配置,比如視圖解析、歡迎頁、請求處理器、過濾器等。
Spring Boot 還支持用戶自定義這些組件,當項目啟動時先檢查用戶有沒有自定義這些組件,如果有定義就使用自定義的,當沒有自定義時就默認使用自動配置的。
比如下面自定義一個支持 RESTful 的過濾器(沒有實際的用途,用于說明問題)
@Configuration public class MyHttpMethodFilter {@Beanpublic HiddenHttpMethodFilter httpMethodFilter() {return new HiddenHttpMethodFilter();} }當項目啟動時,可以通過日志查看是否生效
二、擴展 Spring MVC 配置
在保持上面自動配置的基礎上,Spring Boot 還支持擴展其他的組件,比如攔截器、格式化器、視圖控制器等。@Configuration 注解可以用于實現這個功能,表明這是一個 WebMvcConfigurer 的配置類。當使用這個注解擴展 Spring MVC 時,不能再添加 @EnableWebMvc 注解,原因會在下面講到。
在 Spring Boot 2.0 以前使用 WebMvcConfigurerAdapter 來擴展 Spring MVC 組件,它是一個適配器,實現自 WebMvcConfigurer 接口,里面的方法全部是空方法。目的就是讓我們繼承這個類,重寫里面的方法。
在 Spring Boot 2.0 之后 WebMvcConfigurerAdapter 就已經過時了,并且 WebMvcConfigurer 接口也發生了變化,里面所有的方法都定義成了默認方法(default)。因此我們可以直接實現 WebMvcConfigurer 接口,重寫對應的方法即可,接口中的默認方法是 jdk1.8 才支持的,所以使用時必須保證這一點。
WebMvcConfigurer 接口中可以擴展的方法
下面以攔截器為例來說明問題
自定義攔截器類 MyHandlerInterceptor
/*** Spring Boot2.0 版本以上 HandlerInterceptor 接口中的方法全部是默認方法* 因此這里只重寫 preHandle 方法,在目標方法執行前打印一句話*/ public class MyHandlerInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("== preHandle ==");return true;} }Spring MVC 擴展類 WebConfiguration
@Configuration public class WebConfiguration implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyHandlerInterceptor()).addPathPatterns("/**");} }測試的 Controller
@RequestMapping("/test")@ResponseBodypublic String test() {System.out.println("**************");return "Hello Spring Boot!";}當訪問 /test 時控制臺的輸出如下
三、禁用 Spring MVC 的自動配置
上面提到在使用 WebMvcConfigurer 擴展 Spring MVC 組件時,類上不能加 @EnableWebMvc 注解,原因是在加上該注解后,Spring MVC 的自動配置會失效,所有的東西都需要我們自動配置。
下面來測試一下,在 WebConfiguration 擴展類加上 @EnableWebMvc 注解
@Configuration @EnableWebMvc public class WebConfiguration implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyHandlerInterceptor()).addPathPatterns("/**");} }下面是入口類啟動日志,發現只有一個編碼過濾器生效,這也可以說明編碼過濾器并不屬于自動配置
PS:
從這個問題也可以看出為什么 Spring Boot 受到很多 Java 開發者的喜歡,原因就是當你需要它的時候,它可以自動幫你完成很多任務,當你不需要它時,你也可以完全將它拋棄。
總結
以上是生活随笔為你收集整理的Spring Boot 管理 MVC的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 猪肉检疫印章可以洗掉吗?
- 下一篇: 美股再次大涨!美国50个州全部重启经济,