SpringBoot配置類WebMvcConfigurerAdapter

轉載自:《第三十四章: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配置類,然後設置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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章