美文网首页SpringFrameworkSpring Boot 核心技术程序员
第四十九章:SpringBoot2.0新特性 - 你get到We

第四十九章:SpringBoot2.0新特性 - 你get到We

作者: 恒宇少年 | 来源:发表于2018-03-17 17:22 被阅读3733次

    初升级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学习目录,感谢阅读!
    欢迎加入QQ技术交流群,共同进步。

    QQ技术交流群

    相关文章

      网友评论

      • Stephen_4879:升级spring boot2.0后,日期转换好像不对劲了:
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
        ...
        配置了alibaba FastJson作为消息转换器,结果接口返回的日期格式:2018-04-20T09:00:00.000+0000,大神知道这个该怎么弄吗?1.5.x的时候,这样子配置是正常的
        恒宇少年:@叶秋悲凉 不需要
        鱼_可:实现WebMvcConfigurer接口的类需要添加@EnableWebMvc注解才行
      • 大宝剑_:两种方式抽象类那种方式个人感觉会更好:stuck_out_tongue_winking_eye::stuck_out_tongue_winking_eye:
      • OnLine_058b:大神,一直在学习你的文档,什么时候把自定义redis缓存读取的部分写完啊,很期待!
        恒宇少年:@OnLine_058b 你可以去看看aop这种方式实现自定义
      • 无艰不摧:你咋这么厉害,你多大啦
        恒宇少年:@无艰不摧 额,咱其实都差不多

      本文标题:第四十九章:SpringBoot2.0新特性 - 你get到We

      本文链接:https://www.haomeiwen.com/subject/jhpjqftx.html