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
,代码以下所示: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
跨域咱们以前章节也有讲到,请访问第二十五章: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("*"); }
这一个配置在以前是常常被使用到的,最常常用到的就是"/"、"/index"路径请求时不经过@RequestMapping
配置,而是直接经过配置文件映射指定请求路径到指定View页面,固然也是在请求目标页面时不须要作什么数据处理才能够这样使用,配置内容以下所示:
/** * 视图控制器配置 * @param registry */ @Override public void addViewControllers(ViewControllerRegistry registry) { super.addViewControllers(registry); registry.addViewController("/").setViewName("/index"); }
这个对咱们来讲很熟悉,只要咱们配置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
集合内。
这个配置通常针对于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
在多年被使用的过程当中不断的提供一些默认配置,从而达到用于预计的效果并提升了开发效率。
本章代码已经上传到码云:
网页地址:http://git.oschina.net/jnyqy/lessons
Git地址:https://git.oschina.net/jnyqy/lessons.git
SpringBoot相关系列文章请访问:目录:SpringBoot学习目录
QueryDSL相关系列文章请访问:QueryDSL通用查询框架学习目录
SpringDataJPA相关系列文章请访问:目录:SpringDataJPA学习目录
感谢阅读!
欢迎加入QQ技术交流群,共同进步。