springMVC源码学习之获取参数名
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;
}
}
springMVC源码学习之获取参数名的更多相关文章
- SpringMVC源码学习之request处理流程
目的:为看源码提供调用地图,最长调用逻辑深度为8层,反正我是springMVC源码学习地址看了两周才理出来的. 建议看完后还比较晕的,参照这个简单的模型深入底层,仿SpringMVC自己写框架,再来理 ...
- springMvc源码学习之:spirngMvc的参数注入的问题
转载:https://my.oschina.net/lichhao/blog/172562 概述 在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成 ...
- springmvc源码学习
1.springmvc运行流程 流程图是直接在百度图片中找的一张 >.前台发送请求,请求会首先通过DispatcherServlet进行url的匹配;如果匹配不到,看是否配置<mvc: ...
- springMVC源码学习之addFlashAttribute源码分析
本文主要从falshMap初始化,存,取,消毁来进行源码分析,springmvc版本4.3.18.关于使用及验证请参考另一篇jsp取addFlashAttribute值深入理解即springMVC发r ...
- springMVC源码分析--AbstractHandlerMethodMapping获取url和HandlerMethod对应关系(十)
在之前的博客springMVC源码分析--AbstractHandlerMapping(二)中我们介绍了AbstractHandlerMethodMapping的父类AbstractHandlerMa ...
- springMVC源码学习地址
springmvc工作原理以及源码分析(基于spring3.1.0) 感谢作者 宏愿, 在此记录下,以便学习 SpringMVC源码分析(1):分析DispatcherServlet.doDispa ...
- SpringMVC源码学习:容器初始化+MVC初始化+请求分发处理+参数解析+返回值解析+视图解析
目录 一.前言 二.初始化 1. 容器初始化 根容器查找的方法 容器创建的方法 加载配置文件信息 2. MVC的初始化 文件上传解析器 区域信息解析器 handler映射信息解析 3. Handler ...
- springMvc源码学习之:spring源码总结
转载自:http://www.cnblogs.com/davidwang456/p/4213652.html spring beans下面有如下源文件包: org.springframework.be ...
- springMvc源码学习之:spirngMVC获取请求参数的方法2
@RequestParam,你一定见过:@PathVariable,你肯定也知道:@QueryParam,你怎么会不晓得?!还有你熟悉的他 (@CookieValue)!她(@ModelAndView ...
随机推荐
- DS二叉树--层次遍历
题目描述 层次遍历二叉树,是从根结点开始遍历,按层次次序“自上而下,从左至右”访问树中的各结点. 建树方法采用“先序遍历+空树用0表示”的方法 要求:采用队列对象实现,函数框架如下: 输入 第一行输入 ...
- DS图遍历--广度优先搜索
题目描述 代码框架如下: 输入 第一行输入t,表示有t个测试实例 第二行输入n,表示第1个图有n个结点 第三行起,每行输入邻接矩阵的一行,以此类推输入n行 第i个结点与其他结点如果相连则为1,无连接则 ...
- [蓝桥杯]ALGO-90.算法训练_出现次数最多的整数
问题描述 编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20.然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来.如果有两 ...
- VisualSVNServer 无法启动 could not log pid to file
启动SVN时候报了错误,然后查看日志发现报了如下错误 VisualSVNServer.exe: could not log pid to file C:/Windows/ServiceProfiles ...
- 数据库SQL语言学习--上级练习1(数据查询)
上机练习1 1. 启动SQL Server 2008中的 SQL Server Management Studio. 2. 创建数据库Student ...
- Java-Runoob-高级教程-实例-方法:01. Java 实例 – 方法重载
ylbtech-Java-Runoob-高级教程-实例-方法:01. Java 实例 – 方法重载 1.返回顶部 1. Java 实例 - 方法重载 Java 实例 先来看下方法重载(Overloa ...
- 定位cpu内存问题
定位cpu内存问题 ps -Hp pid 显示进程的线程,P 按CPU内存排序 jstack pid>pid.log 将线程栈 dump 到日志文件中 线程号 十进制转换为 十六进制 在文件中 ...
- 廖雪峰Java3异常处理-1错误处理-4自定义异常
JDK已有的异常: RuntimeException * NullPointerException * IndexOutOfBoundsException * SecurityException * ...
- 简单的单进程FTP服务器的实现
一.功能说明: 1.本程序基于socket实现客户端与服务器端的单进程交互 2.用到的用户名:whw,密码abc123——服务器端密码的验证利用hashlib模块进行MD5的编码以确保通信安全. 3. ...
- [UE4]不推荐的UI更新方式
在创建UI的时候,把UI保存到一个变量,直接访问其中的控件. 这种方法会增加耦合,不推荐,应当尽量避免使用这种方式.