学习SpringMVC(九)之ModelAttribute源码分析

这里以前一章节的内容对ModelAttribute源码进行分析:

注:同学们可以去看下我的前一讲学习SpringMVC(八)之ModelAttribute

1.首先看下第一阶段的断点情况

学习SpringMVC(九)之ModelAttribute源码分析_第1张图片



还未调用ModelAttribute修饰方法前,map值为{}

学习SpringMVC(九)之ModelAttribute源码分析_第2张图片

调用它之后:map值为从数据库中

学习SpringMVC(九)之ModelAttribute源码分析_第3张图片

并将map键值对放到implicitModel中:


最后目标方法的参数数据如下:

学习SpringMVC(九)之ModelAttribute源码分析_第4张图片

2.如何解析目标方法的参数

<span style="color:#ff0000;">Object[] args = resolveHandlerArguments(handlerMethodToInvoke, handler, webRequest, implicitModel);</span>
执行完这一语句,则name值改变,并且密码是从数据库中获取的
因为 resolveHandlerArguments方法的代码很多,不好具体找到,所以我在USER类中的setName()上加了一个断点,便于分析

学习SpringMVC(九)之ModelAttribute源码分析_第5张图片


源码分析流程:

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属性为原来数据库的

学习SpringMVC(九)之ModelAttribute源码分析_第6张图片

在调用doBind(binder, webRequest, validate, validationHints, !assignBindingResult)之后,

binder的target属性为修改后的

学习SpringMVC(九)之ModelAttribute源码分析_第7张图片


你可能感兴趣的:(springMVC,ModelAttribute,implicitModel)