springboot攔截器註解方式
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
配置類,然後設定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
集合內。
配置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配套原始碼地址:https://gitee.com/hengboy/spring-boot-chapter
SpringCloud配套原始碼地址:https://gitee.com/hengboy/spring-cloud-chapter
SpringBoot相關係列文章請訪問:目錄:SpringBoot學習目錄
QueryDSL相關係列文章請訪問:QueryDSL通用查詢框架學習目錄
SpringDataJPA相關係列文章請訪問:目錄:SpringDataJPA學習目錄
感謝閱讀!
作者:恆宇少年
連結:https://www.jianshu.com/p/2c2cdb80fe47
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。