1.入口到参数处理调用流程

入口为spring-webmvc-4.3.18.RELEASE.jar中org.springframework.web.servlet.DispatcherServlet.doService(request,respose)

--》doDispatch(request, response)

--》ha.handle

--》org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal()

--》invokeHandlerMethod()

--》invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);//将parameterNameDiscoverer对象值赋给org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod父类org.springframework.web.method.support.InvocableHandlerMethod.parameterNameDiscoverer对象invocableMethod.parameterNameDiscoverer。

2.取request中参数流程

当处理request时RequestMappingHandlerAdapter.invokeHandlerMethod()调用org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle()调用父类org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest()调用getMethodArgumentValues()取到request中的对应参数值

3.初始化parameterNameDiscoverer流程及源码

以下为初始化org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.parameterNameDiscoverer流程

--》 private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();

--》spring-core-4.3.18.jar org.springframework.core.DefaultParameterNameDiscoverer();

-->spring-core-4.3.18.jar org.springframework.core.PrioritizedParameterNameDiscoverer.addDiscoverer(new org.springframework.core.StandardReflectionParameterNameDiscoverer() extends ParameterNameDiscoverer)

{

  List<ParameterNameDiscoverer> parameterNameDiscoverers.add(ParameterNameDiscoverer pnd)

}

//-->spring-core-4.3.18.jar org.springframework.core.MethodParameters.initParameterNameDiscovery()

在org.springframework.core.ParameterNameDiscoverer.getParameterNames(Method method)

-->org.springframework.core.StandardReflectionParameterNameDiscoverer.getParameterNames(Method method)

package org.springframework.core;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import org.springframework.lang.UsesJava8; @UsesJava8
public class StandardReflectionParameterNameDiscoverer
implements ParameterNameDiscoverer
{
public String[] getParameterNames(Method method)
{
Parameter[] parameters = method.getParameters();//利用java8的新特性来取参数名
String[] parameterNames = new String[parameters.length];
for (int i = 0; i < parameters.length; ++i) {
Parameter param = parameters[i];
if (!(param.isNamePresent()))
return null; parameterNames[i] = param.getName();
}
return parameterNames;
} public String[] getParameterNames(Constructor<?> ctor)
{
Parameter[] parameters = ctor.getParameters();
String[] parameterNames = new String[parameters.length];
for (int i = 0; i < parameters.length; ++i) {
Parameter param = parameters[i];
if (!(param.isNamePresent()))
return null; parameterNames[i] = param.getName();
}
return parameterNames;
}
}

最新文章

  1. Zabbix 漏洞分析
  2. IDisposable的另类用法
  3. JE22环境安装配置(JDK/ANT/TOMCAT/ECLIPSE)
  4. 深入学习JavaScript(一)
  5. pthread_create线程创建的过程剖析
  6. MySQL索引的创建、删除和查看
  7. 使用HTML5 Web存储的localStorage和sessionStorage方式
  8. Silverlight独立存储
  9. Hadoop 学习笔记 (十) MapReduce实现排序 全局变量
  10. WPF Image触摸移动方法
  11. Android Google Map v2具体解释:开发环境配置
  12. 共轭梯度算法求最小值-scipy
  13. [Mysql]mysql windows下配置文件
  14. 语义化标签和jQuery选择器
  15. LNMP环境下安装Redis,以及php的redis扩展
  16. 使用node写一个简单的页面操作
  17. 输入框UITextField禁止输入空格方法
  18. shiro缓存机制
  19. Altium 中异形焊盘异形封装的创建图文教程
  20. 2D变换

热门文章

  1. java中构造方法和普通方法的区别
  2. 网页如何检查浏览器是否安装flash插件
  3. java高并发编程(二)
  4. appium+python自动化 adb shell按键操作
  5. 传统Java Web(非Spring Boot)、非Java语言项目接入Spring Cloud方案
  6. MATLAB在三维坐标中显示图片 并 使得图片部分透明
  7. mariadb semi plugin遇到的坑
  8. 每天一点点oracle
  9. PG cannot execute UPDATE in a read-only transaction | How to add column if not exists on PostgreSQL
  10. css属性—position的使用与页面的分层介绍