第三十四章:SpringBoot配置類WebMvcConfigurerAdapter

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實現類

咱們建立一個配置實體類型,並繼承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

配置CORS

跨域咱們以前章節也有講到,請訪問第二十五章: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("*");
    }複製代碼

配置ViewController

這一個配置在以前是常常被使用到的,最常常用到的就是"/"、"/index"路徑請求時不經過@RequestMapping配置,而是直接經過配置文件映射指定請求路徑到指定View頁面,固然也是在請求目標頁面時不須要作什麼數據處理才能夠這樣使用,配置內容以下所示:

/**
     * 視圖控制器配置
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        super.addViewControllers(registry);
        registry.addViewController("/").setViewName("/index");
    }複製代碼

配置ViewResolver

這個對咱們來講很熟悉,只要咱們配置html、Jsp頁面視圖時就會用到InternalResourceViewResolver配置類,而後設置preffixsuffix參數進行配置視圖文件路徑前綴與後綴。配置代碼以下所示:

/**
     * 配置請求視圖映射
     * @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在多年被使用的過程當中不斷的提供一些默認配置,從而達到用於預計的效果並提升了開發效率。

本章代碼已經上傳到碼雲:
SpringBoot配套源碼地址:gitee.com/hengboy/spr…
SpringCloud配套源碼地址:gitee.com/hengboy/spr…
SpringBoot相關係列文章請訪問:目錄:SpringBoot學習目錄
QueryDSL相關係列文章請訪問:QueryDSL通用查詢框架學習目錄
SpringDataJPA相關係列文章請訪問:目錄:SpringDataJPA學習目錄
感謝閱讀!
歡迎加入QQ技術交流羣,共同進步。

QQ技術交流羣
QQ技術交流羣
相關文章
相關標籤/搜索