题外:
spring3.1后对注解使用的handlermapping和adapter是RequestMappingHandlerMapping 和 处理器适配器RequestMappingHandlerAdapter
,之前是DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter
。
题内:
之前通过url找到对应的类的处理方法,然后需要将报文中的参数转换为处理方法需要的参数,具体实现是靠adapter中的解析器实现的。adapter对应参数的解析,也是先注册解析器,然后判断那个解析器适合就用哪个,这些解析器可以自己构建,系统也提供一下默认的,通过getDefaultArgumentResolvers获得。每个解析器的实现类都会实现supportsParameter方法,用于判断是否支持处理方法中的参数。比如参数上有@requestbody,则RequestResponseBodyMethodProcessor这个解析器会被选中,这个解析器没有用databinder去做参数类型的转换(报文中的参数类型转换为处理方法中的参数类型),而是使用HttpMessageConverter作为转换器,用户可以注册各种实现了httpmesageConverter接口的类用于类型转换,当然系统也提供了一下默认实现类。一般@requestbody用于复杂类型的转换,入json、xml。又如参数上有@requestpara,他会选择RequestParamMethodArgumentResolver,这个解析器的转换器是databinder(Conversionservice),一般用于简单类型的转换,比如form,它一般是先从request.getParameter获取对应参数的字符串值,然后通过转换器进行转换。
转换器的选择是根据报文content-type和目标类型来匹配合适的转换器()