第四十九章:SpringBoot2.0新特性 - 你get到WebMvcConfigurer兩種配置方式了嗎?

恆宇少年發表於2018-06-23

初升級SpringBoot2.0版本,在已經使用SpringBoot1.x的系統內還是存在一些相容性的問題,有很多變化!!!也存在一些過時的方法、配置檔案資訊以及類,我們在之前版本的SpringBoot1.x中可以使用WebMvcConfigurerAdapter抽象類來處理SpringMVC相關的配置,由於SpringBoot2.0版本最低支援 JDK1.8環境,在JDK1.8引入了特殊的關鍵字default,該關鍵字配置在interface介面的方法時子類可以不去實現該方法,相當於抽象類內已經實現的介面方法。

本章目標

代替WebMvcConfigurerAdapter抽象類擴充套件SpringMVC相關配置。

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>
        <!--新增web依賴配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
</dependencies>
//......
複製程式碼

新版本我們可以採用兩種方式來配置WebMvcConfigurer

  1. JavaBean方式配置WebMvcConfigurer
  2. WebMvcConfigurer實現類方式

方式一:JavaBean配置WebMvcConfigurer

採用JavaBean方式我們只需要新增一個web相關配置的型別,並且配置@Configuration註解,將該配置類託管給Spring IOC完成配置,程式碼配置如下所示:

/**
 * web配置類
 *
 * @author:於起宇 <br/>
 * ===============================
 * Created with IDEA.
 * Date:2018/3/15
 * Time:下午10:29
 * 簡書:http://www.jianshu.com/u/092df3f77bca
 * ================================
 */
@Configuration
public class WebJavaBeanConfiguration {
    /**
     * 日誌攔截器
     */
    @Autowired
    private LogInterceptor logInterceptor;

    /**
     * 例項化WebMvcConfigurer介面
     *
     * @return
     */
    @Bean
    public WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurer() {
            /**
             * 新增攔截器
             * @param registry
             */
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(logInterceptor).addPathPatterns("/**");
            }
        };
    }
}
複製程式碼

我們通過@Bean註解的返回值來完成WebMvcConfigurer的配置例項化,在WebMvcConfigurer介面例項內呼叫addInterceptors方法完成新增攔截器配置,跟之前WebMvcConfigurerAdapter方式感覺沒事區別,只不過是編碼形式有一點變化。

測試攔截器

在上面配置內新增了一個LogInterceptor攔截器,該攔截器目的很簡單,僅僅是測試攔截器配置是否生效,程式碼也很簡單,輸出訪問地址的URI,實現程式碼如下所示:

@Component
public class LogInterceptor implements HandlerInterceptor {
    /**
     * logger instance
     */
    static Logger logger = LoggerFactory.getLogger(LogInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        logger.info("請求路徑:{}", request.getRequestURI());
        return true;
    }
}
複製程式碼

測試控制器

為了測試訪問地址被攔截需要新增一個測試控制器請求地址,測試控制器程式碼如下所示:

/**
 * 測試控制器
 * @author:於起宇 <br/>
 * ===============================
 * Created with IDEA.
 * Date:2018/3/15
 * Time:下午10:34
 * 簡書:http://www.jianshu.com/u/092df3f77bca
 * ================================
 */
@RestController
public class TestController {
    /**
     * 測試攔截地址
     * @return
     */
    @RequestMapping(value = "/index")
    public String index() {
        return "Success";
    }
}
複製程式碼

執行測試配置

我們來啟動專案,訪問地址http://127.0.0.1:8080/index,檢視控制檯輸出內容,如下所示:

2018-03-17 16:51:26.633  INFO 2152 --- [nio-8080-exec-1] c.h.c.interceptors.LogInterceptor        : 請求路徑:/index
複製程式碼

根據日誌的輸出我們判定JavaBean配置WebMvcConfigurer的方式是可以生效的,回想文章開頭說到的關鍵字deault,既然default修飾的方法可以不被子類實現,那麼我們完全可以實現WebMvcConfigurer介面,來新增對應的配置,下面我們來嘗試新增一個新的配置類使用實現介面的方式來新增攔截器的配置。

方式二:實現類配置WebMvcConfigurer

我們建立一個名為WebConfiguration的配置類並且實現WebMvcConfigurer介面,程式碼如下所示:

/**
 * web相關配置類
 * @author:於起宇 <br/>
 * ===============================
 * Created with IDEA.
 * Date:2018/3/17
 * Time:下午4:45
 * 簡書:http://www.jianshu.com/u/092df3f77bca
 * ================================
 */
@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    /**
     * 日誌攔截器
     */
    @Autowired
    private LogInterceptor logInterceptor;

    /**
     * 重寫新增攔截器方法並新增配置攔截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
         registry.addInterceptor(logInterceptor).addPathPatterns("/**");
    }
}
複製程式碼

第二種方式有點我們之前使用的感覺,只不過之前是使用的WebMvcConfigurerAdapter抽象類,而現在我們直接使用WebMvcConfigurer介面。

正因為SpringBoot2.0是基於JDK1.8及以上版本,所以可以完全使用JDK1.8新特性提供更好的實現方式。

重啟嘗試再次測試

我們重啟專案,再次訪問地址http://127.0.0.1:8080/index在控制檯檢視,輸出內容跟方式一一樣,也就表明了這種配置也是可以生效的。

總結

本章介紹了SpringBoot2.0版本的WebMvcConfigurer兩種的配置方式,可以根據自己的喜好在專案中進行配置,不過第二種可能更吻合專案中的開發模式。

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

QQ技術交流群

微信掃碼關注 - 專注分享

相關文章