这里以前一章节的内容对ModelAttribute源码进行分析:
注:同学们可以去看下我的前一讲学习SpringMVC(八)之ModelAttribute
1.首先看下第一阶段的断点情况
还未调用ModelAttribute修饰方法前,map值为{}
调用它之后:map值为从数据库中
并将map键值对放到implicitModel中:
最后目标方法的参数数据如下:
2.如何解析目标方法的参数
<span style="color:#ff0000;">Object[] args = resolveHandlerArguments(handlerMethodToInvoke, handler, webRequest, implicitModel);</span>执行完这一语句,则name值改变,并且密码是从数据库中获取的
源码分析流程:
1.调用@ModelAttribute修饰的方法,实际上是把map中的键值对放入到implicitModel当中
2.解析请求处理器的目标参数,实际上该目标参数来自于WebDataBinder对象的target属性
2.1 创建WebDataBinder对象时,需要先确定它的两个属性:target,objectName
下图中,name对应objectName,target对应bindObject
2.1.1 确定objectName属性:
若传入的attrName属性值为“ ”,则objectName为类名第一个字母小写,
若有属性值,则objectName为@modelAttribute的value属性值
2.1.2 确定target属性:
在implicitModel中查找attrName的键名,如果有,则取出返回。如果没有,则
验证当前的controller是否用了@sessionAttribute来修饰,若使用了,则尝试从
session中,获取attrName对应的属性值,若有,则取出,若无,则抛出异常;若
当前controller没有用@sessionAttribute修饰,则通过反射机制创建一个,
WebDataBinder对象。
返回WebDataBinder对象binder
在调用doBind(binder, webRequest, validate, validationHints, !assignBindingResult)之前,binder的
target属性为原来数据库的
在调用doBind(binder, webRequest, validate, validationHints, !assignBindingResult)之后,
binder的target属性为修改后的