ServletResponseMethodArgumentResolver
// @since 3.1 public class ServletResponseMethodArgumentResolver implements HandlerMethodArgumentResolver { // 它相对来说很比较简单 @Override public boolean supportsParameter(MethodParameter parameter) { Class<?> paramType = parameter.getParameterType(); return (ServletResponse.class.isAssignableFrom(paramType) || // webRequest.getNativeResponse(requiredType) OutputStream.class.isAssignableFrom(paramType) || //response.getOutputStream() Writer.class.isAssignableFrom(paramType)); //response.getWriter() } @Override public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception { // 这个判断放在这。。。 if (mavContainer != null) { mavContainer.setRequestHandled(true); } ... } }
SessionStatusMethodArgumentResolver
支持SessionStatus
。值为:mavContainer.getSessionStatus();
UriComponentsBuilderMethodArgumentResolver
// @since 3.1 public class UriComponentsBuilderMethodArgumentResolver implements HandlerMethodArgumentResolver { // UriComponentsBuilder/ ServletUriComponentsBuilder @Override public boolean supportsParameter(MethodParameter parameter) { Class<?> type = parameter.getParameterType(); return (UriComponentsBuilder.class == type || ServletUriComponentsBuilder.class == type); } @Override public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception { HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); return ServletUriComponentsBuilder.fromServletMapping(request); } }
通过UriComponentsBuilder
来得到URL的各个部分,以及构建URL都是非常的方便的。
RedirectAttributesMethodArgumentResolver
和重定向属性RedirectAttributes
相关。
// @since 3.1 public class RedirectAttributesMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { return RedirectAttributes.class.isAssignableFrom(parameter.getParameterType()); } @Override public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception { ModelMap redirectAttributes; // 把DataBinder传入到RedirectAttributesModelMap里面去~~~~ if (binderFactory != null) { DataBinder dataBinder = binderFactory.createBinder(webRequest, null, DataBinder.DEFAULT_OBJECT_NAME); redirectAttributes = new RedirectAttributesModelMap(dataBinder); } else { redirectAttributes = new RedirectAttributesModelMap(); } mavContainer.setRedirectModel(redirectAttributes); return redirectAttributes; } }
如果涉及到重定向:多个视图见传值,使用它还是比较方便的。
ModelMethodProcessor
允许你入参里写:org.springframework.ui.Model、RedirectAttributes、RedirectAttributesModelMap、ConcurrentModel、ExtendedModelMap等等
在本文末尾,说一个特殊的处理器:ModelAttributeMethodProcessor:主要是针对 被 @ModelAttribute注解修饰且不是普通类型(通过 !BeanUtils.isSimpleProperty来判断)的参数。
// @since 3.1 public class ModelAttributeMethodProcessor implements HandlerMethodArgumentResolver, HandlerMethodReturnValueHandler { // 标注有@ModelAttribute它会处理 // 若没有标注(只要不是“简单类型”),它也会兜底处理 @Override public boolean supportsParameter(MethodParameter parameter) { return (parameter.hasParameterAnnotation(ModelAttribute.class) || (this.annotationNotRequired && !BeanUtils.isSimpleProperty(parameter.getParameterType()))); } }
关于@ModelAttribute
这块的使用,参见这里
总结
本文介绍完了四大类的前面三种类型,其中最为常用的是前两种类型的使用,希望大家可以掌握,和好好发挥~