Spring 中参数名称解析 - ParameterNameDiscoverer
Spring 中参数名称解析 - ParameterNameDiscoverer
Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html)
JDK 1.8 之后引入 Parameter 类,可以通过它获取方法中参数的名称。Spring 中也增加了对它的支持 ParameterNameDiscoverer,特别是在 Spring MVC 中大量使用。
一、ParameterNameDiscoverer 使用
@Test
public void testStandardReflectionParameterNameDiscoverer() {
ParameterNameDiscoverer discoverer = new StandardReflectionParameterNameDiscoverer();
// discoverer = new LocalVariableTableParameterNameDiscoverer();
// discoverer = new DefaultParameterNameDiscoverer();
Method method = ReflectionUtils.findMethod(InnerClass.class, "method", List.class);
String[] actualParams = discoverer.getParameterNames(method);
assertThat(actualParams, is(new String[]{"users"}));
}
public class InnerClass {
public void method(@PathVariable("username") @RequestBody final List<Map<String, List<Integer>>> users) {
}
}
二、ParameterNameDiscoverer 源码分析
Spring 中通过 ParameterNameDiscoverer 获取方法中参数的名称,它有有两个几个默认的实现。其中:
PrioritizedParameterNameDiscoverer用来管理 Spring 中注册的所有的 ParameterNameDiscoverer 解析器,内部维护了一个 List 集合,只要有解析参数名称成功的就返回,从而保证了优先级顺序。其子类DefaultParameterNameDiscoverer默认往这个集合中注册了 KotlinReflectionParameterNameDiscoverer、StandardReflectionParameterNameDiscoverer、LocalVariableTableParameterNameDiscoverer 三个解析器。StandardReflectionParameterNameDiscoverer使用 JDK 的 Parameter 解析参数名称,关于 JDK 中参数解析见 <>。LocalVariableTableParameterNameDiscoverer使用 ASM 类库解析参数名称。
ParameterNameDiscoverer 接口如下,用于解析构造器和方法中的参数名称:
public interface ParameterNameDiscoverer {
String[] getParameterNames(Method method);
String[] getParameterNames(Constructor<?> ctor);
}
2.1 StandardReflectionParameterNameDiscoverer
public class StandardReflectionParameterNameDiscoverer implements ParameterNameDiscoverer {
public String[] getParameterNames(Method method) {
return getParameterNames(method.getParameters());
}
public String[] getParameterNames(Constructor<?> ctor) {
return getParameterNames(ctor.getParameters());
}
// 使用 JDK 自带的 Parameter 解析参数名称
private String[] getParameterNames(Parameter[] parameters) {
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;
}
}
每天用心记录一点点。内容也许不重要,但习惯很重要!
Spring 中参数名称解析 - ParameterNameDiscoverer的更多相关文章
- spark-submit的参数名称解析
执行时需要传入的参数说明 Usage: spark-submit [options] <app jar | Python file> [app options] 参数名称 含义 --mas ...
- SSM-Spring-12:Spring中NameMatchMethodPointcutAdvisor名称匹配方法切入点顾问
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- advice 是通知advisor 是顾问 顾问(Advisor) 通知Advice是Spring提供的一种切 ...
- 基于RequestBodyAdvice和ResponseBodyAdvice来实现spring中参数的加密和解密
在日常开发中,有时候我们经常需要和第三方接口打交道,有时候是我们调用别人的第三方接口,有时候是别人在调用我们的第三方接口,那么为了调用接口的安全性,一般都会对传输的数据进行加密操作,如果每个接口都由我 ...
- spring中解析xml
解析xml有SAX,Stax,dom等方式,那么spring中是如何解析xml文件的呢? Document doc = this.documentLoader.loadDocument( inputS ...
- Spring源码深度解析之Spring MVC
Spring源码深度解析之Spring MVC Spring框架提供了构建Web应用程序的全功能MVC模块.通过策略接口,Spring框架是高度可配置的,而且支持多种视图技术,例如JavaServer ...
- 死磕Spring之IoC篇 - 解析自定义标签(XML 文件)
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
- spring mvc: 参数方法名称解析器(用参数来解析控制器下的方法)MultiActionController/ParameterMethodNameResolver/ControllerClassNameHandlerMapping
spring mvc: 参数方法名称解析器(用参数来解析控制器下的方法)MultiActionController/ParameterMethodNameResolver/ControllerClas ...
- Spring MVC参数方法名称解析器
以下示例显示如何使用Spring Web MVC框架来实现多动作控制器的参数方法名称解析器. MultiActionController类可在单个控制器中分别映射多个URL到对应的方法. 所下所示配置 ...
- Spring MVC-控制器(Controller)-参数方法名称解析器(Parameter Method Name Resolver )示例(转载实践)
以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_parametermethodnameresolver.htm 说明:示例基于Sp ...
随机推荐
- spring注解之@Lazy
今天主要从以下几方面来介绍一下@Lazy注解 @Lazy注解是什么 @Lazy注解怎么使用 1,@Lazy注解是什么 @Lazy注解用于标识bean是否需要延迟加载,源码如下: @Target({ ...
- 如何获得scala的帮助和退出
scala> :helpAll commands can be abbreviated, e.g., :he instead of :help.:edit <id>|<line ...
- jms版本
Java消息服务是一个在 Java标准化组织(JCP)内开发的标准(代号JSR 914). 2001年6月25日,Java消息服务发布JMS 1.0.2b,2002年3月18日Java消息服务发布 1 ...
- 批量执行命令(SSH)
for a in {1..6} ; do scp /etc/hosts enc-bigdata0$a:/etc/hosts ; done
- vue, js 正则邮箱验证、匹配非法字符、匹配中文
验证邮箱 let self = this let regEmail= /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)* ...
- RedHat 更新CentOS Yum源(转)
经测试,可用.转自:https://www.cnblogs.com/tangsen/p/5151994.html 一.随笔引言 1.1随笔内容: 1.RedHat 配置Centos yum源 2.yu ...
- Perl 随机数据生成
问题:在IC设计及验证过程中,经常会遇到mem初始化的问题,这时候需要产生hex 的文件,本程序实现这种需求,只需要输入行数,及hex文件的宽度即可. print"Hello World!\ ...
- Flask之before_request、after_request
1.@app.before_request在请求(request)|在视图函数 之前做出响应 解决所有问题 from flask import Flask from flask import re ...
- 对话框 AlterDialog
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("尊敬的用户"); bu ...
- 100-days: Two
Title: London HIV patient's remission spurs hope for curing AIDS HIV 艾滋病毒 human immunodeficiency vi ...