WebMvcConfigurerAdapter
配置類實際上是Spring
內部的一種配置方式,採用JavaBean
的形式來代替傳統的xml
配置文件形式進行鍼對框架個性化定製,下面咱們來看一下該類內的經常使用方法。html
繼承WebMvcConfigurerAdapter
採用JavaBean
形式實現個性化配置定製。java
本章內容一樣不涉及到業務邏輯,咱們建立一個web項目便可,pom.xml配置文件以下所示:git
...//省略
<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
,代碼以下所示:web
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
容器內,咱們打開該註解的源碼查看以下所示:spring
//
// 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
容器內。json
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
方法用於設置攔截器的過濾路徑規則。spring-mvc
跨域咱們以前章節也有講到,請訪問第二十五章:SpringBoot添加支持CORS跨域訪問,Spring
既然爲了集成了CROS
,那就證實了一點,之後先後端分離是一個開發趨勢,配置代碼以下所示:tomcat
/**
* 跨域CORS配置
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
super.addCorsMappings(registry);
registry.addMapping("/cors/**")
.allowedHeaders("*")
.allowedMethods("POST","GET")
.allowedOrigins("*");
}複製代碼
這一個配置在以前是常常被使用到的,最常常用到的就是"/"、"/index"路徑請求時不經過@RequestMapping
配置,而是直接經過配置文件映射指定請求路徑到指定View頁面,固然也是在請求目標頁面時不須要作什麼數據處理才能夠這樣使用,配置內容以下所示:
/**
* 視圖控制器配置
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
super.addViewControllers(registry);
registry.addViewController("/").setViewName("/index");
}複製代碼
這個對咱們來講很熟悉,只要咱們配置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
集合內。
這個配置通常針對於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
在多年被使用的過程當中不斷的提供一些默認配置,從而達到用於預計的效果並提升了開發效率。
本章代碼已經上傳到碼雲:
SpringBoot配套源碼地址:gitee.com/hengboy/spr…
SpringCloud配套源碼地址:gitee.com/hengboy/spr…
SpringBoot相關係列文章請訪問:目錄:SpringBoot學習目錄
QueryDSL相關係列文章請訪問:QueryDSL通用查詢框架學習目錄
SpringDataJPA相關係列文章請訪問:目錄:SpringDataJPA學習目錄
感謝閱讀!
歡迎加入QQ技術交流羣,共同進步。