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源码学习之获取参数名的更多相关文章

  1. SpringMVC源码学习之request处理流程

    目的:为看源码提供调用地图,最长调用逻辑深度为8层,反正我是springMVC源码学习地址看了两周才理出来的. 建议看完后还比较晕的,参照这个简单的模型深入底层,仿SpringMVC自己写框架,再来理 ...

  2. springMvc源码学习之:spirngMvc的参数注入的问题

    转载:https://my.oschina.net/lichhao/blog/172562 概述 在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成 ...

  3. springmvc源码学习

    1.springmvc运行流程 流程图是直接在百度图片中找的一张   >.前台发送请求,请求会首先通过DispatcherServlet进行url的匹配;如果匹配不到,看是否配置<mvc: ...

  4. springMVC源码学习之addFlashAttribute源码分析

    本文主要从falshMap初始化,存,取,消毁来进行源码分析,springmvc版本4.3.18.关于使用及验证请参考另一篇jsp取addFlashAttribute值深入理解即springMVC发r ...

  5. springMVC源码分析--AbstractHandlerMethodMapping获取url和HandlerMethod对应关系(十)

    在之前的博客springMVC源码分析--AbstractHandlerMapping(二)中我们介绍了AbstractHandlerMethodMapping的父类AbstractHandlerMa ...

  6. springMVC源码学习地址

    springmvc工作原理以及源码分析(基于spring3.1.0) 感谢作者  宏愿, 在此记录下,以便学习 SpringMVC源码分析(1):分析DispatcherServlet.doDispa ...

  7. SpringMVC源码学习:容器初始化+MVC初始化+请求分发处理+参数解析+返回值解析+视图解析

    目录 一.前言 二.初始化 1. 容器初始化 根容器查找的方法 容器创建的方法 加载配置文件信息 2. MVC的初始化 文件上传解析器 区域信息解析器 handler映射信息解析 3. Handler ...

  8. springMvc源码学习之:spring源码总结

    转载自:http://www.cnblogs.com/davidwang456/p/4213652.html spring beans下面有如下源文件包: org.springframework.be ...

  9. springMvc源码学习之:spirngMVC获取请求参数的方法2

    @RequestParam,你一定见过:@PathVariable,你肯定也知道:@QueryParam,你怎么会不晓得?!还有你熟悉的他 (@CookieValue)!她(@ModelAndView ...

随机推荐

  1. Eclipse创建一个mybatis工程实现连接数据库查询

    Eclipse上创建第一mybatis工程实现数据库查询 步骤: 1.创建一个java工程 2.创建lib文件夹,加入mybatis核心包.依赖包.数据驱动包.并为jar包添加路径 3.创建resou ...

  2. elasticsearch 口水篇(8)分词 中文分词 ik插件

    先来一个标准分词(standard),配置如下: curl -XPUT localhost:9200/local -d '{ "settings" : { "analys ...

  3. live555峰哥的私房菜(二)-----计划任务(TaskScheduler)探讨

    计划任务(TaskScheduler)探讨 上一篇谈到SingleStep()函数会找到三种任务类型并执行之. 这三种任务是: socket handler, event handler, delay ...

  4. 不同三级域名与二级域名之间互相共享Cookie

    当你在项目中遇到这样一个问题,有多个站点在多个二级级域名如果要实现各域名站点下的登录状态共享,那么最简单的方法就是共享Cookie. 首先声明几个概念,域名怎么去区分. 顶级域名:.com,.cn,. ...

  5. C#应用jstree实现无限级节点的方法

    下载jstree.js下载地址: http://jstree.com/ 当前下载版本: jsTree 3.3.1 第一步:下载完成后引用js+css <link href="~/plu ...

  6. 峰Redis学习(6)Redis 数据结构(sorted-set的操作)

    第六节:Redis 数据结构之sorted-set 类型 存储Sorted-Set Sorted-Set和Set的区别   Sorted-Set中的成员在集合中的位置是有序的   存储Sorted-s ...

  7. 【Laravel】 常用的artisan命令【原创】

    全局篇   查看artisan命令 php artisan php artisan list   查看某个帮助命令 php artisan help make:model   查看laravel版本 ...

  8. AnimationDrawable写贞动画,播放完毕停止在第一或最后一帧

    animation.stop();animation.selectDrawable(0);//只需要在停止的时候,设置下标为你想要的一帧就好了

  9. 2018年1月 attribute VS prop 动画渲染

    attribute和prop和UI存在单向/双向绑定关系,参考 https://m.aliyun.com/yunqi/articles/31499 渲染流程 重绘和重排 ? requestAnimat ...

  10. MySQL之 Mysqldump导出数据库

    参数大全 参数说明 --all-databases , -A 导出全部数据库. mysqldump -uroot -p --all-databases --all-tablespaces , -Y 导 ...