1、 AbstractHandlerMethodMapping类实现了InitializingBean,在InitializingBean中有一个afterPropertiesSet方法。看这个方法的说明:
大概意思是:此方法允许bean实例在设置了所有bean属性后执行其总体配置和最终初始化的验证。会调用AbstractHandlerMethodMapping的afterPropertiesSet方法。
2、afterPropertiesSet调用initHandlerMethods,遍历spring上下文中所有类,调用processCandidateBean去找到注册处理方法。
先获取到类的类型,然后在判断是不是有@Controller或者@RequestMapping注解,如果是的话,就调用detectHandlerMethods开始建立映射关系。
3、detectHandlerMethods流程
- selectMethods:把有@RequestMapping的方法封装成Map<Method,RequestMappingInfo>对象
selectMethods大致流程:
- 循环类里面所有的方法;
- 调用传入匿名类即getMappingForMethod,参数为遍历到的方法,返回值为result
- createRequestMappingInfo把方法传入进去,找到有@RequestMapping注解的方法,然后把注解内容封装成RequestMappingInfo类型的对象info1
- 如果传入的方法有@RequestMapping注解,再找到类上@RequestMapping注解内容并封装成RequestMappingInfo类型的对象info2
- 如果info2不为空,执行合并操作。最后把得到的合并后的RequestMappingInfo对象返回到result
- 如果result不为空,把结果放入到Map<Method,RequestMappingInfo>中,最终返回到methods。
- 遍历得到的methods,先去找到可调用的方法,然后调用registerHandlerMethod(handler,invocableMethod,mapping)。
- registerHandlerMethod:去建立uri与方法的映射关系
registerHandlerMethod流程
- 通过类名称及方法,把方法封装成HandlerMethod对象。
- 校验方法与mapping映射是否唯一。
- 把uri(RequestMappingInfo)与HandlerMethod的对应关系放入到Map<RequestMappingInfo,HandlerMethod> mappingLookup中
- 通过RequestMappingInfo获取到方法的url,然后把url与list<RequestMappingInfo>的对应关系放入到MultiValueMap<String,List<RequestMappingInfo>> urlLookup中
- 判断方法或者类上面有没有@CrossOrigin注解,如果有的话,把注解内容封装成CorsConfiguration,然后把HandlerMethod与CorsConfiguration的对应关系放入到Map<HandlerMethod,CorsConfiguration>corsLookup中。
至此,方法与url的映射关系就全部都建立完成了。