[java] spring core 源码解读之controller方法参数绑定

这篇文章主要是用源码解读下我们常用的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,整个个流程解析的非常清楚了,个人总结,如果有建议,欢迎留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源14

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值