spring mvc的HandlerMethod简介

       在spring mvc的RequestMappingHandlerMapping注册HandlerMethod源码分析这篇文章中简单分析了HandlerMethod注册,那这次就介绍HandlerMethod这个类。

       HandlerMethod封装了很多属性,在访问请求方法的时候可以方便的访问到方法、方法参数、方法上的注解、所属类等并且对方法参数封装处理,也可以方便的访问到方法参数的注解等信息。

      下面,是HandlerMethodn属性字段的源码,每个属性上加了注释说明:

public class HandlerMethod {

    // 虽然Object类型,但是注册handlerMethod时候构造的时候有可能传入的是一个String类型的bean name
	private final Object bean;

    // 见名知义,我调试的时候,传入的是DefaultListableBeanFactory,如果bean属性是Sring的beanName就可以用beanName获取到对应的bean作用Handler
	private final BeanFactory beanFactory;

    // 方法所属类
	private final Class<?> beanType;

    // 注册的方法
	private final Method method;

    // 被桥接的方法,如果method是原生的,这个属性的值就是method
	private final Method bridgedMethod;

    // 封装方法参数的类实例,一个MethodParameter就是一个参数
	private final MethodParameter[] parameters;

    // Http状态码
	private HttpStatus responseStatus;

    // ResponseStatus注解的reason值
	private String responseStatusReason;

	private HandlerMethod resolvedFromHandlerMethod;

    //...
}

顺便提下:

        HandlerMethod还有两个子类,分别为InvocableHandlerMethod和ServletInvocableHandlerMethod,他们的继承关系如下:

InvocableHandlerMethod是在HandlerMethod上增加了调用的功能,而ServletInvocableHandlerMethod是在InvocableHandlerMethod增加了返回值和响应状态码的处理,另外在ServletInvocableHandlerMethod有个内部类ConcurrentResultHandlerMethod继承于它,支持异常调用结果处理。在查找到Handler适配器时候发起对方法调用的便是用ServletInvocableHandlerMethod。

 

  • 9
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以通过配置 `HandlerInterceptor` 来增加 Spring MVC 请求的超时时间。以下是一个示例: ```java public class TimeoutInterceptor implements HandlerInterceptor { private static final int DEFAULT_TIMEOUT = 3000; // 默认超时时间为3秒 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { int timeout = getTimeout(handler); // 获取当前请求处理器的超时时间 if (timeout > 0) { request.setAttribute("javax.servlet.async.request_timeout", timeout); // 设置超时时间 } else { request.setAttribute("javax.servlet.async.request_timeout", DEFAULT_TIMEOUT); // 使用默认超时时间 } return true; } private int getTimeout(Object handler) { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; Timeout timeout = handlerMethod.getMethodAnnotation(Timeout.class); // 从方法上获取超时时间 if (timeout != null) { return timeout.value(); } timeout = handlerMethod.getBeanType().getAnnotation(Timeout.class); // 从类上获取超时时间 if (timeout != null) { return timeout.value(); } } return 0; } } ``` 在上面的代码中,`Timeout` 是一个自定义的注解,表示超时时间。你需要将它添加到需要设置超时时间的请求处理器(即 Controller 中的方法)上。示例代码如下: ```java @RestController public class MyController { @GetMapping("/test") @Timeout(5000) // 设置超时时间为5秒 public String test() { // ... } } ``` 最后,在 Spring MVC 的配置文件中注册 `TimeoutInterceptor`,并将其添加到拦截器链中即可: ```xml <mvc:interceptors> <bean class="com.example.TimeoutInterceptor"/> </mvc:interceptors> ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不识君的荒漠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值