触发入口是DispatcherServlet#initStrategies调用到initHandlerMappings调用BeanFactoryUtils#beansOfTypeIncludingAncestors(ListableBeanFactory, Class, boolean, boolean)获取到key为String,value为handlerMapping的Map容器


    handlerMapping默认实例化BeanNameUrlHandlerMapping,而BeanNameUrlHandlerMapping继承了AbstractDetectingUrlHandlerMapping,AbstractDetectingUrlHandlerMapping继承了AbstractUrlHandlerMapping,AbstractUrlHandlerMapping继承了AbstractHandlerMapping,而AbstractHandlerMapping实现了HandlerMapping接口又继承了WebApplicationObjectSupport

    WebApplicationObjectSupport继承了ApplicationObjectSupport,而ApplicationObjectSupport实现了ApplicationContextAware,而实现了ApplicationContextAware接口,在Spring初始化的过程中必定会执行到ApplicationObjectSupport#setApplicationContext,在setApplicationContext方法内部调用到了initApplicationContext,initApplicationContext调用AbstractDetectingUrlHandlerMapping#initApplicationContext调用到AbstractDetectingUrlHandlerMapping#detectHandlers. 而detectHandlers方法主要做的事情就是拼接url和Controller里面的@RequestMapping注解方法的对应关系…


    注意,先执行的RequestMappingHandlerMapping父类的afterPropertiesSet方法,然后才执行的AbstractDetectingUrlHandlerMapping#detectHandlers,有时间跑断点看看



    主要是RequestMappingHandlerMapping类.

    实例化RequestMappingHandlerMapping Bean之前在AbstractAutowireCapableBeanFactory#invokeInitMethods 调用afterPropertiesSet方法进行RequestMappingHandlerMapping类的基础信息设置,然后会调用父类(AbstractHandlerMethodMapping)的afterPropertiesSet方法.然后调用initHandlerMethods方法

    在 initHandlerMethods方法内部循环所有的符合条件的bean 如果符合条件就会执行detectHandlerMethods方法.

    在detectHandlerMethods 方法内部通过bean名字从spring容器里面获取这个类的字节码,然后再从这个类里面循环所有的方法,检查如果有@RequestMapping 注解的话,给这个方法封装成RequestMappingInfo对象,这个对象有请求路径和请求的类型等等其它属性,比如说get请求或者post请求,


    然后再结合类上面的@RequestMapping注解的路径和方法上的@RequestMapping注解的路径封装成最终的RequestMappingInfo对象(因为光方法路径是访问不到对应的方法的,需要把类和方法结合在一起再行),放入methodMap对象,最后将对应的方法和RequestMappingInfo对象和对应的方法所在的类放入registry容器里面, key是RequestMappingInfo ,value是MappingRegistration对象,
    然后 创建 HandlerMethod 对象,该类型封装了 method、beanName、bean、方法类型等信息
    建立 RequestMappingInfo 和 HandlerMethod 的映射关系(给两个放到mappingLookup的Map里面)

    建立 url 和 RequestMappingInfo 对象的映射关系(放到urlLookup的Map容器里面)

    这样映射关系就已经建立好,这样根据请求 url 我们就可以唯一的找到一个
    HandlerMethod 对象了,注意这个对象中还不能进行反射调用,还确实参数数组.