HandlerAdapter
+boolean supports(Object handler)
+ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
+long getLastModified(HttpServletRequest request, Object handler)
AbstracthandlerMethodAdapter
将handler 限定为 HandlerMethod
提供模版方法supportsInternal, handleInternal, getLastModifiedInternal
RequestMappingHandlerAdapter
// 解析handler 的arguments
- argumentResolvers
// 解析 initBinder 的arguments
- initBinderArgumentResolvers
// 处理handler 返回值,转为ModelAndView
- returnValueHandlers
// controller adivce 里面的model attribute 和 initBinder 缓存. mapping<bean, method set>
- Map<ControllerAdviceBean, Set<Method>> modelAttributeAdviceCache
- Map<ControllerAdviceBean, Set<Method>> initBinderAdviceCache
// 当前controller 的cache
- modelAttributeCache
- initBinderCache
- sessionAttributesHandlerCache
+ ModelAndView handleInternal(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod)
初始化
afterPropertiesSet
- initControllerAdviceCache. 遍历所有的controller advice, 获取注释了model attribute 和 initBinder 的方法
- 设置默认的 argumentResolvers 和 initBinderArugmentsResolvers (获取所有默认
HandlerMethodArgumentResolver
, 设置到HandlerMethodArgumentResolverComposite
实例中) - 设置默认 returnValueHandlers (获取所有默认
HandlerMethodReturnValueHandler
, 设置到HandlerMethodReturnValueHandlerComposite
中 )
Handle
handleInternal
调用
checkRequest(HttpServletRequest)
检查请求 Method, Sessionmav = invokeHandlerMethod(request, response, handlerMethod)
处理获取mav处理HTTP 的cache control header
invokeHandlerMethod
ModelAndView invokeHandlerMethod(HttpServletRequest, HttpServletResponse, HandlerMethod)
ServletWebRequest webRequest = new ServletWebRequest(request, response)
将request, response 塞进一个object 里。binderFactory = getDataBinderFactory(handlerMethod)
生成ServletRequestDataBinderFactory
,并将所有相关的initBinder method注册在binderFactory。binderFactory 负责 DataBinder 的生成。 Databinder 将负责一些简单的参数类型和String间的转换,绑定参数到Model, 参数validation。modelFactory = getModelFactory(handlerMethod, binderFactory)
创建ModelFactory
,并注册相关的 @ModelAttribute method, SessionAttributesHandler。ModelFactory 将负责Model的初始化。invocableMethod = createInvocableHandlerMethod(handlerMethod)
创建ServletInvocableHandlerMethod
, 并设置 argumentResolvers, returnValueHandlers, 及binderFactory, parameterNameDiscovermavContainer = new ModelAndViewContainer()
创建 Model 及 ViewmodelFactory.initModel(webRequest, mavContainer, invocableMethod)
ModelFactory 将 SessionAttribute 和 ModelAttribute 设置进 Model 中。invocableMethod.invokeAndHandle(webRequest, mavContainer). 使用argumentResolver 转换参数,调用Handler, 再用returnValueHandlers 处理return value
getModelAndView(mavContainer, modelFactory, webRequest). 更新请求的 session attrs. 并从container 中取出model 和 view 生成ModelAndView
SessionAttributesHandler
存储了session attrs 的信息,提供了获取/添加/清除session attrs 的方法。session attrs 实际存储在 request attrs 里的 SCOPE_SESSION 中
ModelAndViewContainer
存放model, redirectModel, view 的地方,同时提供更新/删除/合并 model attrs 的方法。
DataBinder
public class DataBinder implements PropertyEditorRegistry, TypeConverter {
private final Object target;
private final String objectName;
private AbstractPropertyBindingResult bindingResult;
private SimpleTypeConverter typeConverter;
private ConversionService conversionService;
}
集成了一系列组件,主要提供三个功能:类型转换,属性绑定,validation。并且可以把绑定或validation 结果输出在 BindingResult
中。
类型转换
实现了TypeConverter
, PropertyEditorRegistry
接口。
利用 SimpleTypeConverter
管理了一系列 PropertyEditor
。使用PropertyEditor
进行类型转换。PropertyEditor
接口定义了 Text <---> 类型 之间的转换。
如果转换不成功,则尝试使用更新的接口ConversionService
(默认实现为DefaultFormattingConversionService
) 进行转换。
属性绑定
通过 BeanWrapperImpl 进行绑定.
实际web 的使用场景只有ModelAttributeMethodProcessor
中对 @ModelAttribute 标记的arguemnt 的属性绑定。
Validation
使用 OptionalValidatorFactoryBean
做为 javax.validation.Validator
的adapter。实际validation 工作交给 hibernate 的 ValidatorImpl
使用场景主要是 AbstractMessageConverterMethodArgumentResolver
中,对request body 进行validation。
HandlerMethodArgumentResolver
定义请求参数的解析方法。
主要实现有
-
AbstractMessageConverterMethodArgumentResolver
,利用HttpMessageConverter
解析request body 等 -
AbstractNamedValueMethodArgumentResolver
,解析query, path varibale 等
提供一个聚合类HandlerMethodArgumentResolverComposite
HandlerMethodReturnValueHandler
处理返回值
主要实现有
- AbstractMessageConverterMethodProcessor,利用
HttpMessageConverter
解析response
ServletInvocableHandlerMethod
Controller 和 handler method 的容器。
private final Object bean;
private final Class<?> beanType;
private final Method method;
private final Method bridgedMethod;
private final MethodParameter[] parameters;
invokeAndHandle
调用
invokeForRequest(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer, Object... providedArgs)
getMethodArgumentValues(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer, Object... providedArgs)
遍历arguments, 调用arguemntResolver 解析请求参数。Object returnValue = doInvoke(args)
用解析出的参数调用handlerthis.returnValueHandlers.handleReturnValue( returnValue, getReturnValueType(returnValue), mavContainer, webRequest)
使用returnValueHandler 处理返回值,设置入 mavContainer中。
总结
HandlerAdapter 由所处理的对象不同,实现了一系列的 HandlerAdapter 类,主要作用为
- 生成 argumentResolver, returnValueResolver
- 解析 hanlder 所需要的参数,从request 中用 argumentResolver提取这些参数。
- 使用解析出的参数,调用 handler
- 用 returnValueHandler 处理返回值
- 对调用结果举行处理,更新request 属性