java 解析参数_SpringBoot如何解析参数的深入理解

前言

前几天笔者在写Rest接口的时候,看到了一种传值方式是以前没有写过的,就萌生了一探究竟的想法。在此之前,有篇文章曾涉及到这个话题,但那篇文章着重于处理流程的分析,并未深入。

本文重点来看几种传参方式,看看它们都是如何被解析并应用到方法参数上的。

一、HTTP请求处理流程

不论在SpringBoot还是SpringMVC中,一个HTTP请求会被DispatcherServlet类接收,它本质是一个Servlet,因为它继承自HttpServlet。在这里,Spring负责解析请求,匹配到Controller类上的方法,解析参数并执行方法,最后处理返回值并渲染视图。

e1ec1dd7bb0a4a24ab3ee22d9e993dae.png

我们今天的重点在于解析参数,对应到上图的目标方法调用这一步骤。既然说到参数解析,那么针对不同类型的参数,肯定有不同的解析器。Spring已经帮我们注册了一堆这东西。

private List getDefaultArgumentResolvers() {

List resolvers = new ArrayList();

resolvers.add(new RequestParamMethodArgumentResolver(this.getBeanFactory(), false));

resolvers.add(new RequestParamMapMethodArgumentResolver());

resolvers.add(new PathVariableMethodArgumentResolver());

resolvers.add(new PathVariableMapMethodArgumentResolver());

resolvers.add(new MatrixVariableMethodArgumentResolver());

resolvers.add(new MatrixVariableMapMethodArgumentResolver());

resolvers.add(new ServletModelAttributeMethodProcessor(false));

resolvers.add(new RequestResponseBodyMethodProcessor(this.getMessageConverters(), this.requestResponseBodyAdvice));

resolvers.add(new RequestPartMethodArgumentResolver(this.getMessageConverters(), this.requestResponseBodyAdvice));

resolvers.add(new RequestHeaderMethodArgumentResolver(this.getBeanFactory()));

resolvers.add(new RequestHeaderMapMethodArgumentResolver());

resolvers.add(new ServletCookieValueMethodArgumentResolver(this.getBeanFactory()));

resolvers.add(new ExpressionValueMethodArgumentResolver(this.getBeanFactory()));

resolvers.add(new SessionAttributeMethodArgumentResolver());

resolvers.add(new RequestAttributeMethodArgumentResolver());

resolvers.add(new ServletRequestMethodArgumentResolver());

resolvers.add(new ServletResponseMethodArgumentResolver());

resolvers.add(new HttpEntityMethodProcessor(this.getMessageConverters(), this.requestResponseBodyAdvice));

resolvers.add(new RedirectAttributesMethodArgumentResolver());

resolvers.add(new ModelMethodProcessor());

resolvers.add(new MapMethodProcessor());

resolvers.add(new ErrorsMethodArgumentResolver());

resolvers.add(new SessionStatusMethodArgumentResolver());

resolvers.add(new UriComponentsBuilderMethodArgumentResolver());

if (this.getCustomArgumentResolvers() != null) {

resolvers.addAll(this.getCustomArgumentResolvers());

}

resolvers.add(new RequestParamMethodArgumentResolver(this.getBeanFactory(), true));

resolvers.add(new ServletModelAttributeMethodProcessor(true));

return resolvers;

}

它们有一个共同的接口HandlerMethodArgumentResolver。supportsParameter用来判断方法参数是否可以被当前解析器解析,如果可以就调用resolveArgument去解析。

public interface HandlerMethodArgumentResolver {

//判断方法参数是否可以被当前解析器解析

boolean supp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值