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 ...
随机推荐
- apache安装配置
因为个人是在docker上面做实验的,所以可以多少会有些出入. 1.先启动一个docker,配置好基本的工具,网络啊,ssh啊是,tar啊,wget啊,vim等等. 其次去官网获取自己想要的压缩文件的 ...
- async.waterfall
[async.waterfall] if any of the tasks pass an error to their own callback, the next function is not ...
- spring boot IDEA 开发微服务(二)
https://www.cnblogs.com/spaceud/p/8097934.html 参考以上微博,自己实际操作步骤如下: 1~开发准备 JDK:1.8 Spring Boot:2.1.0 S ...
- 启动Tomcat的小细节--MyEclipse
1.先停掉Tomcat 2.然后再Redeploy项目 3.然后再启动Tomcat. 这样的好处是 代码彻底编译
- JavaScript中判断null、undefined与NaN的方法
1.判断undefined: ? 1 2 3 4 var tmp = undefined; if (typeof(tmp) == "undefined"){ alert(" ...
- sqoop2问题解决
sqoop:000> show version --serverException has occurred during processing command Exception: org.a ...
- Django项目之客户
关于客户的操作 主页(被继承) {% load static %} <!DOCTYPE html> <html lang="en"> <head> ...
- 颜色 color
在res/values文件夹下的color.xml添加 <?xml version="1.0" encoding="utf-8"?> <res ...
- unbutu中安装jdk并编写第一个java程序
第一部分:安装jdk 1.首先在putty控制台中输入如下命令,检验系统中是否已经装有jdk. java -version 如果显式的结果如下图,则说明没有安装. openjdk是在linux下默认安 ...
- 测试SD卡读写速度
执行测试命令之前,一定先清除缓存:# echo 3> /proc/sys/vm/drop_caches SD卡读取的速度# echo 3> /proc/sys/vm/drop_caches ...