SpringMVC 源码之常用接口

常用接口

HandlerMethodArgumentResolver

作用: 用于解析调用Controller层方法的参数

1
2
3
4
5
6
7
8
9
10
11
12
public interface HandlerMethodArgumentResolver {
/**
* 判断是否可以解析传入的参数
*/
boolean supportsParameter(MethodParameter parameter);
/**
* 实际解析参数
*/
@Nullable
Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
}

常用实现类

  1. ServletRequestMethodArgumentResolver / ServletResponseMethodArgumentResolver
    自动绑定 HttpServletRequest 和 HttpServletResponse
  2. RequestParamMapMethodArgumentResolver
    处理被 @RequestParam 修饰的参数
  3. RequestHeaderMapMethodArgumentResolver
    处理被 @RequestHeader 修饰的参数
  4. PathVariableMapMethodArgumentResolver
    处理被 @PathVariable 修饰的参数
  5. ModelAttributeMethodProcessor
    处理被 @ModelAttribute 修饰的参数
  6. RequestResponseBodyMethodProcessor
    处理被 @RequestBody 修饰的参数

HandlerMethodReturnValueHandler

作用: 处理处理器执行后的返回值,主要有三个功能:

  • 1、将相应的参数添加到model中
  • 2、设置view
  • 3、如果请求已经处理完, 则设置 ModelAndViewContainer 的 requestHandled 为 true
1
2
3
4
5
6
7
8
9
10
11
12
13
public interface HandlerMethodReturnValueHandler {

/**
* 判断是否支持
*/
boolean supportsReturnType(MethodParameter returnType);

/**
* 具体处理返回值
*/
void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception;
}
  1. ModelAttributeMethodProcessor
    处理被 @ModelAttribute 修饰的方法
  2. RequestResponseBodyMethodProcessor
    处理被 @RequestBody 修饰的方法
  3. ViewMethodReturnValueHandler
    处理View类型返回值,如果是 redirect 类型则设置 mavContainer 的 redirectModelScenario

HttpMessageConverter

作用: 转换HTTP请求体和响应体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public interface HttpMessageConverter<T> {

/**
* 能否读取(处理请求体)
*/
boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);

/**
* 能够写入(处理响应体)
*/
boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);

/**
* 获取支持的 MediaType
*/
List<MediaType> getSupportedMediaTypes();

/**
* 读取请求体
*/
T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException;

/**
* 设置响应体
*/
void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException;

}

常用实现类

  1. ByteArrayHttpMessageConverter
  2. StringHttpMessageConverter
  3. ResourceHttpMessageConverter
  4. SourceHttpMessageConverter
  5. AllEncompassingFormHttpMessageConverter
  6. Jaxb2RootElementHttpMessageConverter
  7. MappingJackson2HttpMessageConverter

HandlerInterceptor

作用: Controller 层调用拦截器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public interface HandlerInterceptor {
/**
* preHandler 方法是在 Controller 处理之前调用,SpringMVC 的拦截器是链式的,可以同时存在多个 Interceptor,
* 然后 SpringMVC 会根据声明的顺序执行。SpringMVC 拦截器的链式是可以中断的,
* 当 preHandler 的返回值是 false 时整个请求就结束了
*/
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
/**
* postHandle 在 Controller 方法调用之后,在 DispatcherServlet 进行视图渲染之前执行,
* 也就是说在这个方法中可以操作 ModelAndView,也可以在 DispatcherServlet 中看到调用拦截器的 postHandler 是传入了 ModelAndView 参数。
* 这个方法的链式结构和声明的顺序是相反的,也就是先声明拦截器反而后执行
*/
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
/**
* afterCompletion 在整个请求执行完之后执行,也就是 DispatcherServlet 视图渲染之后执行,这个方法主要作用是用于清理资源
*/
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}

常用实现类

  1. AbstractHandlerMapping.CorsInterceptor
    处理跨域请求
  2. UserRoleAuthorizationInterceptor
    检查当前用户的授权情况

常用注解

ControllerAdvice

作用:此注解的Controller是一个增强的Controller,主要有三个功能
– 全局异常处理
– 全局数据绑定
– 全局数据预处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@ControllerAdvice
public class ControllerAdviceController {
//全局异常处理
@ExceptionHandler(Exception.class)
public ModelAndView customerException(Exception e) {
ModelAndView mv = new ModelAndView();
mv.addObject("message", e.getMessage());
mv.setViewName("myerror");
return mv;
}
// 全局数据绑定
@ModelAttribute(name = "mock")
public Map<String, Object> mockData() {
HashMap<String, Object> map = new HashMap<>();
map.put("age", 99);
map.put("sex", "man");
return map;
}
// 全局数据预处理
@InitBinder("field")
public void defaultPrefix(WebDataBinder binder) {
binder.setFieldDefaultPrefix("field.");
}
}

ExceptionHandler

作用: 用于处理异常的注解。@ExceptionHandler是一个用于处理控制器中出现的异常的注解。它可以用于方法级别,用于指定处理控制器中出现的异常的方式。