《Spring篇》---WebMvcConfigurer

《Spring篇》---WebMvcConfigurer,第1张

《Spring篇》---WebMvcConfigurer

Spring---WebMvcConfigurer
  • 简介
  • WebMvcConfigurer 配合HandlerInterceptor 拦截器配置校验服务
    • Spring拦截器分类
    • HandlerInterceptor
    • 例子
    • 简单描述@Order()注解
      • @Order的注解源码解读
      • Ordered接口类
    • 结论
  • 总结

简介

WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter。基于java-based方式的spring mvc配置,需要创建一个配置类并实现WebMvcConfigurer 接口

WebMvcConfigurer 配合HandlerInterceptor 拦截器配置校验服务 Spring拦截器分类

spring中拦截器主要分两种,一个是HandlerInterceptor,一个是MethodInterceptor。

HandlerInterceptor

HandlerInterceptor是springMVC项目中的拦截器,它拦截的目标是请求的地址,比MethodInterceptor先执行

HandlerInterceptor拦截的是请求地址,所以针对请求地址做一些验证、预处理等 *** 作比较合适。当你需要统计请求的响应时间时MethodInterceptor将不太容易做到,因为它可能跨越很多方法或者只涉及到已经定义好的方法中一部分代码。

实现一个HandlerInterceptor拦截器可以直接实现HandlerInterceptor接口,也可以继承HandlerInterceptorAdapter类。

看下UML:

public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {
    public HandlerInterceptorAdapter() {
    }
   //在业务处理器处理请求之前被调用
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
  //在业务处理器处理请求完成之后,生成视图之前执行  
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }
   // 在DispatcherServlet完全处理完请求之后被调用,可用于清理资源  
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }

    public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    }
}

执行顺序如下:

例子
public class SecurityConfig implements WebMvcConfigurer {

    @Bean
    public SecurityInterceptor securityInterceptor() {
        return new SecurityInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(securityInterceptor()).addPathPatterns("
    int value() default Ordered.LOWEST_PRECEDENCE;
 
}

注解可以作用在类(接口、枚举)、方法、字段声明(包括枚举常量);
注解有一个int类型的参数,可以不传,默认是最低优先级;
通过常量类的值我们可以推测参数值越小优先级越高

Ordered接口类
package org.springframework.core;
 
public interface Ordered {
    int HIGHEST_PRECEDENCE = -2147483648;
    int LOWEST_PRECEDENCE = 2147483647;
 
    int getOrder();
}
结论

1、如果多个拦截器,执行顺序:preHandle() :123 ,postHandle():321,afterCompletion():321

2、preHandle() 返回false,不会往下执行

3、preHandle()返回true的拦截器,必然会执行他的afterCompletion();

4、如果preHandle()都返回true,有一个拦截器的postHandle()抛出异常,则后面拦截器的postHandle()不会执行。(注意:写代码时要注意)

总结

参考相关链接:
WebMvcConfigurer讲解
相关例子参考
@Order注解详解

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5583118.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存