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;
}
}
最新文章
- Zabbix 漏洞分析
- IDisposable的另类用法
- JE22环境安装配置(JDK/ANT/TOMCAT/ECLIPSE)
- 深入学习JavaScript(一)
- pthread_create线程创建的过程剖析
- MySQL索引的创建、删除和查看
- 使用HTML5 Web存储的localStorage和sessionStorage方式
- Silverlight独立存储
- Hadoop 学习笔记 (十) MapReduce实现排序 全局变量
- WPF Image触摸移动方法
- Android Google Map v2具体解释:开发环境配置
- 共轭梯度算法求最小值-scipy
- [Mysql]mysql windows下配置文件
- 语义化标签和jQuery选择器
- LNMP环境下安装Redis,以及php的redis扩展
- 使用node写一个简单的页面操作
- 输入框UITextField禁止输入空格方法
- shiro缓存机制
- Altium 中异形焊盘异形封装的创建图文教程
- 2D变换
热门文章
- java中构造方法和普通方法的区别
- 网页如何检查浏览器是否安装flash插件
- java高并发编程(二)
- appium+python自动化 adb shell按键操作
- 传统Java Web(非Spring Boot)、非Java语言项目接入Spring Cloud方案
- MATLAB在三维坐标中显示图片 并 使得图片部分透明
- mariadb semi plugin遇到的坑
- 每天一点点oracle
- PG cannot execute UPDATE in a read-only transaction | How to add column if not exists on PostgreSQL
- css属性—position的使用与页面的分层介绍