SpringBoot配置类WebMvcConfigurerAdapter

WebMvcConfigurerAdapter配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,下面我们来看一下该类内的常用方法。

本章目标

继承WebMvcConfigurerAdapter采用JavaBean形式实现个性化配置定制。

构建项目

本章内容同样不涉及到业务逻辑,我们创建一个web项目即可,pom.xml配置文件如下所示:

 
  1. ...//省略

  2. <dependencies>

  3. <dependency>

  4. <groupId>org.springframework.boot</groupId>

  5. <artifactId>spring-boot-starter-web</artifactId>

  6. </dependency>

  7.  
  8. <dependency>

  9. <groupId>org.springframework.boot</groupId>

  10. <artifactId>spring-boot-starter-tomcat</artifactId>

  11. <!--<scope>provided</scope>-->

  12. </dependency>

  13. <dependency>

  14. <groupId>org.springframework.boot</groupId>

  15. <artifactId>spring-boot-starter-test</artifactId>

  16. <scope>test</scope>

  17. </dependency>

  18. </dependencies>

  19. ...//省略

WebMvcConfigurerAdapter实现类

我们创建一个配置实体类型,并继承WebMvcConfigurerAdapter,代码如下所示:

 
  1. package com.yuqiyu.chapter34;

  2.  
  3. import org.springframework.context.annotation.Configuration;

  4. import org.springframework.web.servlet.config.annotation.*;

  5.  
  6. import java.util.List;

  7.  
  8. /**

  9. * 自定义配置类实现JavaBean注解形式配置

  10. * ========================

  11. * Created with IntelliJ IDEA.

  12. * User:恒宇少年

  13. * Date:2017/9/3

  14. * Time:21:48

  15. * 码云:http://git.oschina.net/jnyqy

  16. * ========================

  17. */

  18. @Configuration

  19. public class WebConfiguration

  20. extends WebMvcConfigurerAdapter

  21. {

  22. }

我们在配置类上添加了注解@Configuration,标明了该类是一个配置类并且会将该类作为一个SpringBean添加到IOC容器内,我们打开该注解的源码查看如下所示:

 
  1. //

  2. // Source code recreated from a .class file by IntelliJ IDEA

  3. // (powered by Fernflower decompiler)

  4. //

  5.  
  6. package org.springframework.context.annotation;

  7.  
  8. import java.lang.annotation.Documented;

  9. import java.lang.annotation.ElementType;

  10. import java.lang.annotation.Retention;

  11. import java.lang.annotation.RetentionPolicy;

  12. import java.lang.annotation.Target;

  13. import org.springframework.stereotype.Component;

  14.  
  15. @Target({ElementType.TYPE})

  16. @Retention(RetentionPolicy.RUNTIME)

  17. @Documented

  18. @Component

  19. public @interface Configuration {

  20. String value() default "";

  21. }

可以看到在@Configuration 上声明式添加了Spring注入注解@Component,也就是解释了为什么我们配置了@Configuration会被自动添加到IOC容器内。

WebMvcConfigurerAdapter该抽象类其实里面没有任何的方法实现,只是空实现了接口WebMvcConfigurer内的全部方法,并没有给出任何的业务逻辑处理,这一点设计恰到好处的让我们不必去实现那些我们不用的方法,都交由WebMvcConfigurerAdapter抽象类空实现,如果我们需要针对具体的某一个方法做出逻辑处理,仅仅需要在WebMvcConfigurerAdapter子类中@Override对应方法就可以了。

配置拦截器

在之前Xml配置形式天下的时候,我们都是在spring-mvc.xml配置文件内添加<mvc:interceptor>标签配置拦截器。拦截器的相关创建请访问第六章:如何在SpringBoot项目中使用拦截器,拦截器配置如下所示:

 
  1. /**

  2. * 拦截器配置

  3. * @param registry

  4. */

  5. @Override

  6. public void addInterceptors(InterceptorRegistry registry) {

  7. super.addInterceptors(registry);

  8. registry.addInterceptor(new TestInterceptor()).addPathPatterns("/**");

  9. }

InterceptorRegistry 内的addInterceptor需要一个实现HandlerInterceptor接口的拦截器实例,addPathPatterns方法用于设置拦截器的过滤路径规则。

配置CORS

跨域我们之前章节也有讲到,请访问第二十五章:SpringBoot添加支持CORS跨域访问Spring既然为了集成了CROS,那就证明了一点,以后前后端分离是一个开发趋势,配置代码如下所示:

 
  1. /**

  2. * 跨域CORS配置

  3. * @param registry

  4. */

  5. @Override

  6. public void addCorsMappings(CorsRegistry registry) {

  7. super.addCorsMappings(registry);

  8. registry.addMapping("/cors/**")

  9. .allowedHeaders("*")

  10. .allowedMethods("POST","GET")

  11. .allowedOrigins("*");

  12. }

配置ViewController

这一个配置在之前是经常被使用到的,最经常用到的就是"/"、"/index"路径请求时不通过@RequestMapping配置,而是直接通过配置文件映射指定请求路径到指定View页面,当然也是在请求目标页面时不需要做什么数据处理才可以这样使用,配置内容如下所示:

 
  1. /**

  2. * 视图控制器配置

  3. * @param registry

  4. */

  5. @Override

  6. public void addViewControllers(ViewControllerRegistry registry) {

  7. super.addViewControllers(registry);

  8. registry.addViewController("/").setViewName("/index");

  9. }

配置ViewResolver

这个对我们来说很熟悉,只要我们配置html、Jsp页面视图时就会用到InternalResourceViewResolver配置类,然后设置preffixsuffix参数进行配置视图文件路径前缀与后缀。配置代码如下所示:

 
  1. /**

  2. * 配置请求视图映射

  3. * @return

  4. */

  5. @Bean

  6. public InternalResourceViewResolver resourceViewResolver()

  7. {

  8. InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();

  9. //请求视图文件的前缀地址

  10. internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");

  11. //请求视图文件的后缀

  12. internalResourceViewResolver.setSuffix(".jsp");

  13. return internalResourceViewResolver;

  14. }

  15.  
  16. /**

  17. * 视图配置

  18. * @param registry

  19. */

  20. @Override

  21. public void configureViewResolvers(ViewResolverRegistry registry) {

  22. super.configureViewResolvers(registry);

  23. registry.viewResolver(resourceViewResolver());

  24. /*registry.jsp("/WEB-INF/jsp/",".jsp");*/

  25. }

上述代码中方法resourceViewResolver上配置了@Bean注解,该注解会将方法返回值加入到SpringIoc容器内。
而在configureViewResolvers方法内配置视图映射为resourceViewResolver方法返回的InternalResourceViewResolver实例,这样完成了视图的配置。在下面还有注释掉的一部分代码,这块代码很神奇,我们先来看看org.springframework.web.servlet.config.annotation.ViewResolverRegistry源码:

 
  1. package org.springframework.web.servlet.config.annotation;

  2.  
  3. public class ViewResolverRegistry {

  4. ...//省略代码

  5. public UrlBasedViewResolverRegistration jsp() {

  6. return this.jsp("/WEB-INF/", ".jsp");

  7. }

  8.  
  9. public UrlBasedViewResolverRegistration jsp(String prefix, String suffix) {

  10. InternalResourceViewResolver resolver = new InternalResourceViewResolver();

  11. resolver.setPrefix(prefix);

  12. resolver.setSuffix(suffix);

  13. this.viewResolvers.add(resolver);

  14. return new UrlBasedViewResolverRegistration(resolver);

  15. }

  16. }

  17. ...//省略代码

可以看到上述源码中有两个jsp方法,而没有参数的方法恰恰跟我们配置的内容一样,这一点看来是Spring早就根据用户使用习惯添加的默认配置,同样也提供了自定义配置Jsp相关的前缀、后缀内容的方法,
方法内部同样是实例化了一个InternalResourceViewResolver 视图映射类,并将实例添加到了viewResolvers集合内。

配置MessageConverter

这个配置一般针对于Api接口服务程序,配置在请求返回时内容采用什么转换器进行转换,我们最常用到的就是fastJson的转换,配置如下所示:

 
  1. /**

  2. * 消息内容转换配置

  3. * 配置fastJson返回json转换

  4. * @param converters

  5. */

  6. @Override

  7. public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

  8. //调用父类的配置

  9. super.configureMessageConverters(converters);

  10. //创建fastJson消息转换器

  11. FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();

  12. //创建配置类

  13. FastJsonConfig fastJsonConfig = new FastJsonConfig();

  14. //修改配置返回内容的过滤

  15. fastJsonConfig.setSerializerFeatures(

  16. SerializerFeature.DisableCircularReferenceDetect,

  17. SerializerFeature.WriteMapNullValue,

  18. SerializerFeature.WriteNullStringAsEmpty

  19. );

  20. fastConverter.setFastJsonConfig(fastJsonConfig);

  21. //将fastjson添加到视图消息转换器列表内

  22. converters.add(fastConverter);

  23. }

内容转换都是针对面向接口进行编写的实现类,都必须implements HttpMessageConverter接口完成方法的实现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值