轉載自:《第三十四章:SpringBoot配置類WebMvcConfigurerAdapter》
WebMvcConfigurerAdapter
配置類其實是Spring
內部的一種配置方式,採用JavaBean
的形式來代替傳統的xml
配置文件形式進行鍼對框架個性化定製,下面我們來看一下該類內的常用方法。
本章目標
繼承WebMvcConfigurerAdapter
採用JavaBean
形式實現個性化配置定製。
SpringBoot 企業級核心技術學習專題
專題 | 專題名稱 | 專題描述 |
---|---|---|
001 | Spring Boot 核心技術 | 講解SpringBoot一些企業級層面的核心組件 |
002 | Spring Boot 核心技術章節源碼 | Spring Boot 核心技術簡書每一篇文章碼雲對應源碼 |
003 | Spring Cloud 核心技術 | 對Spring Cloud核心技術全面講解 |
004 | Spring Cloud 核心技術章節源碼 | Spring Cloud 核心技術簡書每一篇文章對應源碼 |
005 | QueryDSL 核心技術 | 全面講解QueryDSL核心技術以及基於SpringBoot整合SpringDataJPA |
006 | SpringDataJPA 核心技術 | 全面講解SpringDataJPA核心技術 |
007 | SpringBoot核心技術學習目錄 | SpringBoot系統的學習目錄,敬請關注點贊!!! |
構建項目
本章內容同樣不涉及到業務邏輯,我們創建一個web項目即可,pom.xml配置文件如下所示:
...//省略
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--<scope>provided</scope>-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
...//省略
WebMvcConfigurerAdapter實現類
我們創建一個配置實體類型,並繼承WebMvcConfigurerAdapter
,代碼如下所示:
package com.yuqiyu.chapter34;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
import java.util.List;
/**
* 自定義配置類實現JavaBean註解形式配置
* ========================
* Created with IntelliJ IDEA.
* User:恆宇少年
* Date:2017/9/3
* Time:21:48
* 碼雲:http://git.oschina.net/jnyqy
* ========================
*/
@Configuration
public class WebConfiguration
extends WebMvcConfigurerAdapter
{
}
我們在配置類上添加了註解@Configuration
,標明瞭該類是一個配置類並且會將該類作爲一個SpringBean
添加到IOC
容器內,我們打開該註解的源碼查看如下所示:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.context.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.stereotype.Component;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
String value() default "";
}
可以看到在@Configuration
上聲明式添加了Spring注入註解@Component
,也就是解釋了爲什麼我們配置了@Configuration
會被自動添加到IOC
容器內。
WebMvcConfigurerAdapter
該抽象類其實裏面沒有任何的方法實現,只是空實現了接口WebMvcConfigurer
內的全部方法,並沒有給出任何的業務邏輯處理,這一點設計恰到好處的讓我們不必去實現那些我們不用的方法,都交由WebMvcConfigurerAdapter
抽象類空實現,如果我們需要針對具體的某一個方法做出邏輯處理,僅僅需要在WebMvcConfigurerAdapter
子類中@Override
對應方法就可以了。
配置攔截器
在之前Xml
配置形式天下的時候,我們都是在spring-mvc.xml
配置文件內添加<mvc:interceptor>
標籤配置攔截器。攔截器的相關創建請訪問第六章:如何在SpringBoot項目中使用攔截器,攔截器配置如下所示:
/**
* 攔截器配置
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
super.addInterceptors(registry);
registry.addInterceptor(new TestInterceptor()).addPathPatterns("/**");
}
InterceptorRegistry
內的addInterceptor
需要一個實現HandlerInterceptor
接口的攔截器實例,addPathPatterns
方法用於設置攔截器的過濾路徑規則。
配置CORS
跨域我們之前章節也有講到,請訪問第二十五章:SpringBoot添加支持CORS跨域訪問,Spring
既然爲了集成了CROS
,那就證明了一點,以後前後端分離是一個開發趨勢,配置代碼如下所示:
/**
* 跨域CORS配置
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
super.addCorsMappings(registry);
registry.addMapping("/cors/**")
.allowedHeaders("*")
.allowedMethods("POST","GET")
.allowedOrigins("*");
}
配置ViewController
這一個配置在之前是經常被使用到的,最經常用到的就是"/"、"/index"路徑請求時不通過@RequestMapping
配置,而是直接通過配置文件映射指定請求路徑到指定View頁面,當然也是在請求目標頁面時不需要做什麼數據處理纔可以這樣使用,配置內容如下所示:
/**
* 視圖控制器配置
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
super.addViewControllers(registry);
registry.addViewController("/").setViewName("/index");
}
配置ViewResolver
這個對我們來說很熟悉,只要我們配置html、Jsp頁面視圖時就會用到InternalResourceViewResolver
配置類,然後設置preffix
、suffix
參數進行配置視圖文件路徑前綴與後綴。配置代碼如下所示:
/**
* 配置請求視圖映射
* @return
*/
@Bean
public InternalResourceViewResolver resourceViewResolver()
{
InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
//請求視圖文件的前綴地址
internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");
//請求視圖文件的後綴
internalResourceViewResolver.setSuffix(".jsp");
return internalResourceViewResolver;
}
/**
* 視圖配置
* @param registry
*/
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
super.configureViewResolvers(registry);
registry.viewResolver(resourceViewResolver());
/*registry.jsp("/WEB-INF/jsp/",".jsp");*/
}
上述代碼中方法resourceViewResolver
上配置了@Bean
註解,該註解會將方法返回值加入到SpringIoc
容器內。
而在configureViewResolvers
方法內配置視圖映射爲resourceViewResolver
方法返回的InternalResourceViewResolver
實例,這樣完成了視圖的配置。在下面還有註釋掉的一部分代碼,這塊代碼很神奇,我們先來看看org.springframework.web.servlet.config.annotation.ViewResolverRegistry
源碼:
package org.springframework.web.servlet.config.annotation;
public class ViewResolverRegistry {
...//省略代碼
public UrlBasedViewResolverRegistration jsp() {
return this.jsp("/WEB-INF/", ".jsp");
}
public UrlBasedViewResolverRegistration jsp(String prefix, String suffix) {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix(prefix);
resolver.setSuffix(suffix);
this.viewResolvers.add(resolver);
return new UrlBasedViewResolverRegistration(resolver);
}
}
...//省略代碼
可以看到上述源碼中有兩個jsp方法,而沒有參數的方法恰恰跟我們配置的內容一樣,這一點看來是Spring
早就根據用戶使用習慣添加的默認配置,同樣也提供了自定義配置Jsp相關的前綴、後綴內容的方法,
方法內部同樣是實例化了一個InternalResourceViewResolver
視圖映射類,並將實例添加到了viewResolvers
集合內。
配置MessageConverter
這個配置一般針對於Api
接口服務程序,配置在請求返回時內容採用什麼轉換器進行轉換,我們最常用到的就是fastJson
的轉換,配置如下所示:
/**
* 消息內容轉換配置
* 配置fastJson返回json轉換
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//調用父類的配置
super.configureMessageConverters(converters);
//創建fastJson消息轉換器
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//創建配置類
FastJsonConfig fastJsonConfig = new FastJsonConfig();
//修改配置返回內容的過濾
fastJsonConfig.setSerializerFeatures(
SerializerFeature.DisableCircularReferenceDetect,
SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullStringAsEmpty
);
fastConverter.setFastJsonConfig(fastJsonConfig);
//將fastjson添加到視圖消息轉換器列表內
converters.add(fastConverter);
}
內容轉換都是針對面向接口進行編寫的實現類,都必須implements
HttpMessageConverter
接口完成方法的實現。
總結
以上內容就是本章的全部講解內容,本章主要講解了採用JavaBean
配置的形式代替傳統的Xml
配置文件的形式進行多種配置聲明,根據源碼我們可見到Spring
在多年被使用的過程中不斷的提供一些默認配置,從而達到用於預計的效果並提高了開發效率。
作者:恆宇少年
鏈接:https://www.jianshu.com/p/2c2cdb80fe47
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。