第四十九章: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 条评论
登录 后参与评论

相关文章

来自专栏琯琯博客

awesome-java-cn

Java 资源列表,内容包括:构建工具、数据库、框架、模板、安全、代码分析、日志、第三方库、书籍、Java 站点等等。 古董级工具 这些工具伴随着Java一起出...

5408
来自专栏一个会写诗的程序员的博客

Gatling : 次时代性能测试利器

Gatling作为一款开源免费的性能测试工具越来越受到广大程序员的欢迎。免费当然是好的,最缺钱的就是程序员了;开源更好啊,缺啥功能、想做定制化的可以自己动手,丰...

1002
来自专栏Java技术

Spring Cloud微服务全家桶主要组件及简要介绍

微服务是最近的一两年的时间里是很火的一个概念。感觉不学习一下都快跟不上时代的步伐了,下边做一下简单的总结和介绍。

1793
来自专栏chenssy

【死磕Netty】-----Netty的核心组件

原文出处http://cmsblogs.com/ 『chenssy』 转载请注明原创出处,谢谢! 在第一篇博客中(【死磕Netty】-----NIO基础详解),...

4915
来自专栏一个会写诗的程序员的博客

java日志commons-logging/log4j/slf4j/logBack需要知道的几件事

如果对于commons-loging、log4j、slf4j、LogBack等都已经非常清楚了,可以忽略本文。几次解决日志冲突问题时对这几个概念的简单总结,希望...

904
来自专栏格子的个人博客

Jenkins系列一:安装和简单配置Jenkins简单介绍Jenkins安装

Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

1661
来自专栏架构师之旅

《Spring敲门砖之基础教程第一季》 第一章(2)解读Spring Framework

系统架构 一个成功的项目离不开一个好的架构,一个好的架构自然需要一位好的设计师, Rod Johnson正是Spring的前生总架构设计师,那...

1896
来自专栏java学习

Java每日一题1_关于Spring

A Spring Core:Core封装包是框架的最基础部分,提供IOC和依赖注入特性

785
来自专栏Java职业技术分享

一个老程序员是如何手写Spring MVC的?「附代码」

人见人爱的Spring已然不仅仅只是一个框架了。如今,Spring已然成为了一个生态。但深入了解Spring的却寥寥无几。这里,我带大家一起来看看,我是如何手写...

810
来自专栏Java Web

IDEA 整合 SSM 框架学习

认识 Spring 框架 更多详情请点击这里:这里 Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC ...

1K8

扫码关注云+社区