在之前的博客中我们已经接触过HandlerMethod,接下来我们简单介绍一下HandlerMethod,简单来说HandlerMethod包含的信息包括类、方法和参数的一个信息类,通过其两个构造函数我们就可以了解其功能,对应着springMVC的Controller来说就是某个url对应的某个Controller执行的方法。

/*** Create an instance from a bean instance and a method.*/public HandlerMethod(Object bean, Method method) {Assert.notNull(bean, "Bean is required");Assert.notNull(method, "Method is required");this.bean = bean;this.beanFactory = null;this.beanType = ClassUtils.getUserClass(bean);this.method = method;this.bridgedMethod = BridgeMethodResolver.findBridgedMethod(method);this.parameters = initMethodParameters();this.resolvedFromHandlerMethod = null;}
/*** Create an instance from a bean instance, method name, and parameter types.* @throws NoSuchMethodException when the method cannot be found*/public HandlerMethod(Object bean, String methodName, Class<?>... parameterTypes) throws NoSuchMethodException {Assert.notNull(bean, "Bean is required");Assert.notNull(methodName, "Method name is required");this.bean = bean;this.beanFactory = null;this.beanType = ClassUtils.getUserClass(bean);this.method = bean.getClass().getMethod(methodName, parameterTypes);this.bridgedMethod = BridgeMethodResolver.findBridgedMethod(this.method);this.parameters = initMethodParameters();this.resolvedFromHandlerMethod = null;}

完整源码如下:

public class HandlerMethod {/** Logger that is available to subclasses */protected final Log logger = LogFactory.getLog(getClass());private final Object bean;private final BeanFactory beanFactory;private final Class<?> beanType;private final Method method;private final Method bridgedMethod;private final MethodParameter[] parameters;private final HandlerMethod resolvedFromHandlerMethod;//创建一个实例,根据bean实例和method方法public HandlerMethod(Object bean, Method method) {Assert.notNull(bean, "Bean is required");Assert.notNull(method, "Method is required");this.bean = bean;this.beanFactory = null;this.beanType = ClassUtils.getUserClass(bean);this.method = method;this.bridgedMethod = BridgeMethodResolver.findBridgedMethod(method);this.parameters = initMethodParameters();this.resolvedFromHandlerMethod = null;}//根据bean,方法名以及参数类型创建实例public HandlerMethod(Object bean, String methodName, Class<?>... parameterTypes) throws NoSuchMethodException {Assert.notNull(bean, "Bean is required");Assert.notNull(methodName, "Method name is required");this.bean = bean;this.beanFactory = null;this.beanType = ClassUtils.getUserClass(bean);this.method = bean.getClass().getMethod(methodName, parameterTypes);this.bridgedMethod = BridgeMethodResolver.findBridgedMethod(this.method);this.parameters = initMethodParameters();this.resolvedFromHandlerMethod = null;}//根据bean名称,BeanFactory工厂和method方法创建实例public HandlerMethod(String beanName, BeanFactory beanFactory, Method method) {Assert.hasText(beanName, "Bean name is required");Assert.notNull(beanFactory, "BeanFactory is required");Assert.notNull(method, "Method is required");this.bean = beanName;this.beanFactory = beanFactory;this.beanType = ClassUtils.getUserClass(beanFactory.getType(beanName));this.method = method;this.bridgedMethod = BridgeMethodResolver.findBridgedMethod(method);this.parameters = initMethodParameters();this.resolvedFromHandlerMethod = null;}protected HandlerMethod(HandlerMethod handlerMethod) {Assert.notNull(handlerMethod, "HandlerMethod is required");this.bean = handlerMethod.bean;this.beanFactory = handlerMethod.beanFactory;this.beanType = handlerMethod.beanType;this.method = handlerMethod.method;this.bridgedMethod = handlerMethod.bridgedMethod;this.parameters = handlerMethod.parameters;this.resolvedFromHandlerMethod = handlerMethod.resolvedFromHandlerMethod;}private HandlerMethod(HandlerMethod handlerMethod, Object handler) {Assert.notNull(handlerMethod, "HandlerMethod is required");Assert.notNull(handler, "Handler object is required");this.bean = handler;this.beanFactory = handlerMethod.beanFactory;this.beanType = handlerMethod.beanType;this.method = handlerMethod.method;this.bridgedMethod = handlerMethod.bridgedMethod;this.parameters = handlerMethod.parameters;this.resolvedFromHandlerMethod = handlerMethod;}private MethodParameter[] initMethodParameters() {int count = this.bridgedMethod.getParameterTypes().length;MethodParameter[] result = new MethodParameter[count];for (int i = 0; i < count; i++) {result[i] = new HandlerMethodParameter(i);}return result;}public Object getBean() {return this.bean;}public Method getMethod() {return this.method;}public Class<?> getBeanType() {return this.beanType;}protected Method getBridgedMethod() {return this.bridgedMethod;}public MethodParameter[] getMethodParameters() {return this.parameters;}public HandlerMethod getResolvedFromHandlerMethod() {return this.resolvedFromHandlerMethod;}public MethodParameter getReturnType() {return new HandlerMethodParameter(-1);}public MethodParameter getReturnValueType(Object returnValue) {return new ReturnValueMethodParameter(returnValue);}public boolean isVoid() {return Void.TYPE.equals(getReturnType().getParameterType());}//获取方法上的注解,单个注解,如果没有注解则返回方法本身public <A extends Annotation> A getMethodAnnotation(Class<A> annotationType) {return AnnotatedElementUtils.findMergedAnnotation(this.method, annotationType);}//创建handlerMethodpublic HandlerMethod createWithResolvedBean() {Object handler = this.bean;if (this.bean instanceof String) {String beanName = (String) this.bean;handler = this.beanFactory.getBean(beanName);}return new HandlerMethod(this, handler);}@Overridepublic boolean equals(Object other) {if (this == other) {return true;}if (!(other instanceof HandlerMethod)) {return false;}HandlerMethod otherMethod = (HandlerMethod) other;return (this.bean.equals(otherMethod.bean) && this.method.equals(otherMethod.method));}@Overridepublic int hashCode() {return (this.bean.hashCode() * 31 + this.method.hashCode());}@Overridepublic String toString() {return this.method.toGenericString();}/*** A MethodParameter with HandlerMethod-specific behavior.*/protected class HandlerMethodParameter extends SynthesizingMethodParameter {public HandlerMethodParameter(int index) {super(HandlerMethod.this.bridgedMethod, index);}@Overridepublic Class<?> getContainingClass() {return HandlerMethod.this.getBeanType();}@Overridepublic <T extends Annotation> T getMethodAnnotation(Class<T> annotationType) {return HandlerMethod.this.getMethodAnnotation(annotationType);}}/*** A MethodParameter for a HandlerMethod return type based on an actual return value.*/private class ReturnValueMethodParameter extends HandlerMethodParameter {private final Object returnValue;public ReturnValueMethodParameter(Object returnValue) {super(-1);this.returnValue = returnValue;}@Overridepublic Class<?> getParameterType() {return (this.returnValue != null ? this.returnValue.getClass() : super.getParameterType());}}}

springMVC源码分析--HandlerMethod相关推荐

  1. springMVC源码分析--访问请求执行ServletInvocableHandlerMethod和InvocableHandlerMethod

    在之前一篇博客中 springMVC源码分析--RequestMappingHandlerAdapter(五)我们已经简单的介绍到具体请求访问的执行某个Controller中的方法是在RequestM ...

  2. SpringMVC源码分析_1 SpringMVC容器启动和加载原理

                                                                    SpringMVC源码分析_1 SpringMVC启动和加载原理     ...

  3. SpringMVC源码分析(4)剖析DispatcherServlet重要组件

    简单介绍了一个请求的处理过程, 简略描述了调用过程,并没有涉及过多细节,如url匹配,报文解析转换等. <SpringMVC源码分析(2)DispatcherServlet的初始化>:介绍 ...

  4. 简单直接让你也读懂springmvc源码分析(3.1)-- HandlerMethodReturnValueHandler

    该源码分析系列文章分如下章节: springmvc源码分析(1)-- DispatcherServlet springmvc源码分析(2)-- HandlerMapping springmvc源码分析 ...

  5. SpringMVC源码分析_框架原理图

                                                                                 SpringMVC源码分析_框架原理图     ...

  6. Springmvc源码分析、底层原理

    1.Springmvc是如何找到Controller的? 首先在请求过来时,会先进入DispatcherServlet进行请求分发,执行DispatcherServlet类中的doDispatch() ...

  7. SpringMVC源码分析(二)

    1.DispatcherServlet源码分析 1.@InitBinder(续) 1.DataBinder概述 package org.springframework.validation; 此类所在 ...

  8. SpringMVC源码分析系列[转]

    说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Servlet容器元素来设计的,同时sp ...

  9. SpringMVC源码分析系列

    说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Servlet容器元素来设计的,同时sp ...

最新文章

  1. C/C++面试题分享
  2. 武汉科技大学ACM:1002: 华科版C语言程序设计教程(第二版)例题6.6
  3. zendopcache代替APC效果不错
  4. 打家劫舍系列(dp)
  5. Linux NB的单行命令
  6. PHP客户端缓存控制
  7. gRPC in ASP.NET Core 3.x -- Protocol Buffer(3)更新消息类型
  8. python多线程编程_Python 多线程编程
  9. matlab大作业题题单,2011MATLAB大作业-题目-
  10. mysql临时表怎么显示_如何查看MySQL临时表的说明?
  11. html5表单提交json数据库,使用html5的FormData对象,通过 Ajax表单异步提交文件数据...
  12. eigrp与ospf的综合实验(还是要想想办法才做得出来哦)
  13. php金税系统打印接口,金税开票接口解决方案
  14. 微信小程序的微信开发者工具的快捷键查找和设置
  15. 最新【2021.1.28】今日头条_signature 分析
  16. flutter 报错 No MediaQuery widget ancestor found.
  17. 杭电复试2018年笔试第三题--西瓜地(最小生成树)
  18. 基于JavaWeb的影视创作论坛的设计与实现/影视系统
  19. php开源cms系统比较好,最受欢迎免费开源CMS建站系统排行榜
  20. Java之字符类型char

热门文章

  1. 字节码插桩(javassist)之插入代码块|IOC框架(Hilt)之对象注入~研究
  2. 2019,我的工作寻找之路
  3. 计算机启动后无法进入系统怎么办,开机进不了windows系统怎么办
  4. 产品沉思录精选:为何知识资本将胜过金融资本
  5. 随笔(2015.11)
  6. HC-05,HC-06AT指令
  7. C语言编程之计算平均成绩
  8. C#面试经历分享(好好看,好好学)
  9. Veritas NetBackup8.1.1安装
  10. Libra,一场赛博朋克噩梦!