×

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

96
恒宇少年
2018.03.17 17:22* 字数 1034

初升级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核心技术
007 SpringBoot核心技术学习目录 SpringBoot系统的学习目录,敬请关注点赞!!!

构建项目

我们本章仅仅使用了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学习目录,感谢阅读!

微信扫码关注 - 专注分享

加入知识星球,恒宇少年带你走以后的技术道路!!!

微信扫码加入
Spring Boot 企业级技术
Web note ad 1