spring源码---创建URL与controller方法映射

1、 AbstractHandlerMethodMapping类实现了InitializingBean,在InitializingBean中有一个afterPropertiesSet方法。看这个方法的说明:

大概意思是:此方法允许bean实例在设置了所有bean属性后执行其总体配置和最终初始化的验证。会调用AbstractHandlerMethodMappingafterPropertiesSet方法。

 

2、afterPropertiesSet调用initHandlerMethods,遍历spring上下文中所有类,调用processCandidateBean去找到注册处理方法。

 

 

 

先获取到类的类型,然后在判断是不是有@Controller或者@RequestMapping注解,如果是的话,就调用detectHandlerMethods开始建立映射关系。

3、detectHandlerMethods流程

  • selectMethods:把有@RequestMapping的方法封装成Map<Method,RequestMappingInfo>对象

              selectMethods大致流程:

  1. 循环类里面所有的方法;
  2. 调用传入匿名类即getMappingForMethod,参数为遍历到的方法,返回值为result
  3. createRequestMappingInfo把方法传入进去,找到有@RequestMapping注解的方法,然后把注解内容封装成RequestMappingInfo类型的对象info1
  4. 如果传入的方法有@RequestMapping注解,再找到类上@RequestMapping注解内容并封装成RequestMappingInfo类型的对象info2
  5. 如果info2不为空,执行合并操作。最后把得到的合并后的RequestMappingInfo对象返回到result
  6. 如果result不为空,把结果放入到Map<Method,RequestMappingInfo>中,最终返回到methods。
  • 遍历得到的methods,先去找到可调用的方法,然后调用registerHandlerMethod(handler,invocableMethod,mapping)
  • registerHandlerMethod:去建立uri与方法的映射关系

              registerHandlerMethod流程

  1. 通过类名称及方法,把方法封装成HandlerMethod对象。
  2. 校验方法与mapping映射是否唯一。
  3. uriRequestMappingInfo)与HandlerMethod的对应关系放入到Map<RequestMappingInfo,HandlerMethod> mappingLookup
  4. 通过RequestMappingInfo获取到方法的url,然后把urllist<RequestMappingInfo>的对应关系放入到MultiValueMap<String,List<RequestMappingInfo>> urlLookup
  5. 判断方法或者类上面有没有@CrossOrigin注解,如果有的话,把注解内容封装成CorsConfiguration,然后把HandlerMethodCorsConfiguration的对应关系放入到Map<HandlerMethod,CorsConfiguration>corsLookup中。

至此,方法与url的映射关系就全部都建立完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值