在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。

 

更多推荐

spring mvc的HandlerMethod简介