1. 程式人生 > >SpringBoot配置類WebMvcConfigurerAdapter

SpringBoot配置類WebMvcConfigurerAdapter

WebMvcConfigurerAdapter配置類其實是Spring內部的一種配置方式,採用JavaBean的形式來代替傳統的xml配置檔案形式進行鍼對框架個性化定製,下面我們來看一下該類內的常用方法。

本章目標

繼承WebMvcConfigurerAdapter採用JavaBean形式實現個性化配置定製。

SpringBoot 企業級核心技術學習專題

專題 專題名稱 專題描述
001 講解SpringBoot一些企業級層面的核心元件
002 Spring Boot 核心技術簡書每一篇文章碼雲對應原始碼
003 對Spring Cloud核心技術全面講解
004 Spring Cloud 核心技術簡書每一篇文章對應原始碼
005 全面講解QueryDSL核心技術以及基於SpringBoot整合SpringDataJPA
007 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配置類,然後設定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在多年被使用的過程中不斷的提供一些預設配置,從而達到用於預計的效果並提高了開發效率。



作者:恆宇少年
連結:https://www.jianshu.com/p/2c2cdb80fe47
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。