这篇文章主要是用源码解读下我们常用的controller方法里面参数是如何绑定上去的
上篇文章spring mobile源码解读我们只分析到了DeviceHandlerMethodArgumentResolver的resolveArgument返回request中设置的Device对象,在controller的方法参数里只要添加Device接口,就可以用了,
留下了一个问题是:request中设置的Device对象又是如何交由spring处理的呢?
开始源码一步步解读
spring 核心类 DispatcherServlet开始
DispatcherServlet是一个 HttpServlet的,客户端请求进入 doService
doService里面设置了 上下文对象 WebApplicationContext 、区域解析器 localResolver 、 动态样式解析器themeResolver、
样式资源、 跳转参数存放 flashMapManager 之类的对象 ,这些可以自己去看,继续往下看 doDispatch
由于这个方法逻辑非常复杂,是整个最核心的地方、所以我只讲一个点
标记1处:获取当前请求适配器,我们知道,我们定义一个接口可以通过 servlet, @controller, @RequestMpping 等等,spring通过请求的路由判断是用RequestMappingHandlerAdapter ,HttpRequestHandlerAdapter, SimpleCOntrollerHandlerAdapter
由于我们使用@RequestMapping定义的,
所以 ha返回一个RequestMapingHandlerAdapter
好,我们接着往下看 handle方法
调用了handleInternal方法
1、这里判断是不是有异步的,如果@Async 注解、考虑了这种场景
接下来看invokeHandlerMethod方法
这里解读两点
1、获取请求方法 invocableMethod 对象, 该对象包含方法的参数类型,返回值等等一系列信息
2、设置我们上边注入到spring bean管理的 DeviceHandlerMethodArgumentResolver 对象到 argumentResolvers 中去
接下来看调用的方法了 invokeAndHandle
1、我们看到,这里循环方法的参数类型,作为supportsParameter参数
接下来看supportsParameter方法实现
‘
1、我们看到了,这里循环所有方法参数解析器,这里才是调用我们之前定义的DeviceHandlerMethodArgumentResolver的supportsParameter方法啊,如果参数类型是我们的Device实现类,那么返回不为空
那么最后会执行DeviceHandlerMethodArgumentResolver的 resolveArgument返回设备对象, args[i] 直接赋值为此对象,所以我们可以直接使用了
ok,整个个流程解析的非常清楚了,个人总结,如果有建议,欢迎留言