第四十九章:SpringBoot2.0新特性 - 你get到WebMvcConfigurer两种配置方式了吗?

初升级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核心技术

构建项目

我们本章仅仅使用了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配套源码地址:https://gitee.com/hengboy/spring-boot-chapter SpringCloud配套源码地址:https://gitee.com/hengboy/spring-cloud-chapter SpringBoot相关系列文章请访问:目录:SpringBoot学习目录 QueryDSL相关系列文章请访问:QueryDSL通用查询框架学习目录 SpringDataJPA相关系列文章请访问:目录:SpringDataJPA学习目录,感谢阅读!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ImportSource

教你看懂redis配置系列

摘要:最近工作中需要开发redis的一个云管理平台。所以要求要对这些参数了如指掌,特结合网络资料和自己翻译小撸此文。感谢junjie 【 简介】 我们可以在启动...

4359
来自专栏程序之美

socket异常问题

可能这两种代码看上去区别不大唯一区别就是输入输出流的关闭顺序。而这种顺序不同也会导致出错。

1264
来自专栏SDNLAB

深入探秘Neutron API

一、Neutron API概述 Neutron项目作为一个虚拟网络资源池,提供了如下三种使用方式: 通过Web界面,也就是通过Dashboard来使用网络上的功...

3597
来自专栏算法修养

Memcached 简单利用和简单了解(Mac的安装和使用)

Memcached 是一种用于分布式应用的一种缓存机制。应用也比较广泛。这里来学习一下。 首先Memcached 是分布式网站架构都需要用到的缓存机制。缓存就是...

3456
来自专栏LinkedBear的个人空间

初试RocketMQ消息中间件 原

消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间...

1034
来自专栏埋名

常见HTTP/FTP/WebSockets状态码大全

这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于HTTP/1.0协议中没有定义任何1...

1033
来自专栏容器云生态

redis超时原因排查

1.低效操作产生的延迟。单命令操作一半很快不会造成这样,SORT,LREM, SUNION,keys ,* 等操作都会影响响应时间。 使用进程监控程序(top,...

4366
来自专栏PHP技术

Session原理简述

Session存在的意义,估计每个做web开发的人都是了解的,就为了解决HTTP是无状态协议所带来的问题,不多说了。这里主要想说的是服务端与客户端是如何利用se...

2976
来自专栏后端之路

Mybatis实现指定时间db只读方案

背景 由于定时任务集计要求,在每天凌晨指定时间需要做库表备份 如果用户对于某些数据进行操作可能导致一些数据不平 【库存】凌晨00:00:00-00:10:00之...

2146
来自专栏沃趣科技

事务已提交另外会话查询不到的问题解析

导 读 今天遇到一个很有趣的问题:跑python代码程序,使用python程序开启两个session连接数据库,先在第一个session里面对t表查询,然后到第...

2717

扫码关注云+社区