zoukankan      html  css  js  c++  java
  • 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;
      }
    }
  • 相关阅读:
    ODBC数据源选项卡中的系统DNS,用户DNS和文件DNS
    Oracle学习的零散问题
    【今日CV 计算机视觉论文速览】Thu, 7 Mar 2019
    【图像风格转换】项目参考资料总结
    【今日CV 计算机视觉论文速览】Thu, 28 Feb 2019
    【今日CV 计算机视觉论文速览】Tue, 26 Feb 2019
    【今日CV 计算机视觉论文速览】Wed, 27 Feb 2019
    【python】set集合基础与使用
    hdu 4259 Double Dealing
    hdu 1538 A Puzzle for Pirates 博弈论
  • 原文地址:https://www.cnblogs.com/pu20065226/p/10178437.html
Copyright © 2011-2022 走看看