本文依旧是对文章详解SpringMVC中Controller的方法中参数的工作原理的补充说明。
找到相应的处理器后,调用处理器方法,有了方法,又有这个方法属于哪个类,可以确定是使用反射调用。但是缺少了方法参数。所以需要解析出方法参数。
public interface HandlerMethodArgumentResolver {
// 这个参数解析器是否支持这个参数的解析
boolean supportsParameter(MethodParameter parameter);
// 开始解析参数。
// 先来看看传进来的参数:
// parameter方法参数
// mavContainer保存了数据
// webRequest请求,也保存了数据
// binderFactory用来类型转换,如果不是不同的类型,还有就是属性的注入功能
Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
}

注意:
如果是javabean类型的,使用的是ModelAttributeMethodProcessor处理器,先实例化一个该类型的对象,之后通过MutablePropertyValues mpvs = new MutablePropertyValues(request.getParameterMap());使用binder进行属性赋值。
如果是普通类型,也就是除了自定义的类型的,全是归他管,使用的是RequestParamMethodArgumentResolver,通过String[] paramValues = request.getParameterValues(name);取到值,之后通过binder进行类型转换。
如果是@requestBody类型的,会从request.getBody()得到数据,之后通过content-type,使用对应的装换器装换数据。
参数解析,离不开的是WebDataBinder,这里有类型转换的工具。而这个类主要的功能就是类型转换和给javaBean属性赋值。