前言
发生在refresh方法的最后一步,发布上下文刷新事件的时候触发
1、创建XmlWebApplicationContext
2、调用refresh()方法
3、bean都创建完成后发布上下文刷新事件,开始初始化handlerMapping
一、springmvc初始化handlerMapping时序图
二、handlerMapping什么时候处理url和handler映射关系的?
首先在FrameworkServlet里初始化XmlWebApplicationContext实例,并会添加一个ContextRefreshContext事件到容器,在bean都创建完成后,上下文发布ContextRefreshContext事件,DispatcherServlet最终在initStrategies方法里初始化handlerMapping,如果容器中没有相应的handler实例,则获取默认handler实例并注入容器,默认handler创建如下:
在dispatcherServlet.properties文件里配置了handlerMapping的3个实现类全路径,然后使用applicationContext创建这三个类,其中有一个类BeanNameUrlHandlerMapping间接实现了ApplicationContextAware接口,在这个接口的setApplicationContext方法里最终执行的BeanNameUrlHandlerMapping的determineUrlsForHandler方法处理映射关系
另一个RequestMappingHandlerMapping在afterPropertersSet方法里初始化handlerMethod
1、扫描所有bean
2、判断类是否有@Controller或者@RequestMapping注解
3、生成HandlerMethod
AbstractHandlerMethodMapping实现了InitializingBean,在afterPropertiesSet()方法里,去发现controller的方法,并注册到自己的handlerMethods(LinkedHashMap)里面