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 ...
随机推荐
- Oracle VM VirtulBox 安装Ubuntu16.04
曾经自己在电脑中检索到Ubuntu kylin 16-10.vmdk 后就通过. 这种方式就进行了新建. 后自己从http://www.gaofumei.net/linux-download/783. ...
- Realtime Rendering 6
[Realtime Rendering 6] 1.Lighting computations occur in two phases: 1)light phase. used to compute t ...
- windows 查询端口占用 杀掉进程
参考 https://www.cnblogs.com/lynn-li/p/6077993.html netstat -ano | findstr "8001" taskkill / ...
- oracle 查询列表中选取其中一行
select k.SAL from (select SAL,rownum rn from (select SAL from SCOTT.EMP where MGR = 7698 order by SA ...
- js中获取一个对象里面的方法和属性的javascript
<script type="text/javascript"> var obj = { attribute:1, method:function() { alert(& ...
- Access sql语句创建表及字段类型(转)
http://www.cnblogs.com/hnyei/archive/2012/02/23/2364812.html 创建一张空表: Sql="Create TABLE [表名]&quo ...
- vue生命周期简介
vue生命周期简介 生命周期的钩子 LifeCycle hooks 上面已经能够清晰的看到vue2.0都包含了哪些生命周期的钩子函数~~ 那么 执行顺序以及什么时候执行,我们上代码来看~~~ 生命周期 ...
- LibreOJ 6277. 数列分块入门 1
题目链接:https://loj.ac/problem/6277 参考博客:https://www.cnblogs.com/stxy-ferryman/p/8547731.html 两个操作,区间增加 ...
- Android模拟器故障:waiting for target deviceto come online
关闭再打开模拟器.删除再新建模拟器均无效. 解决办法:在AVD Manager中,选择立即冷启动(Cold Boot Now)模拟器.
- openal支持的通道数和声道数
alext.h: #define AL_FORMAT_QUAD8 0x1204 101 #define AL_FORMAT_QUAD16 0x1205 102 #define AL_FORMAT_Q ...