spring-webmvc版本5.2.5,springboot版本2.2.6
一.HandlerMapping是什么?
HandlerMapping 可以理解成url和对应要执行代码段关系的集合,如RequestMappingHandlerMapping处理器映射,带有@RequestMapping("/test")注解的方法和url:"/test"的映射集合。
二.HandlerMapping怎么来的?
1.DispatcherServlet调用init()方法时,如果允许全部的处理器(detectAllHandlerMappings为true),则从spring ioc容器中取类型HandlerMapping的对象,并排序(所以HandlerMapping的实例对象要实现Ordered排序接口)
2.sping ioc怎么会有HandlerMapping?
@EnableAutoConfiguration-->autoconfigure项目META-INF\spring.factories-->WebMvcAutoConfiguration配置类中在ioc容器中实例化了五个HandlerMapping实现类,RequestMappingHandlerMapping(方法级别)、BeanNameUrlHandlerMapping(controller级别的使用)、RouterFunctionMapping、SimpleUrlHandlerMapping(静态资源/controller级别的使用)、WelcomePageHandlerMapping(欢迎页)
3.具体作用
RequestMappingHandlerMapping(方法级别):InterceptorRegistry.addInterceptor添加拦截器HandlerInterceptor对象;实现InitializingBean接口,在afterPropertiesSet方法中,拿到spring ioc容器中的所有带有@RequestMapping注解的方法,找到方法和url的关系,放到集合中

BeanNameUrlHandlerMapping(controller级别的使用):一个url就是一个beanName,对应一个Controller
@Component("/BeanNameUrlHandlerMappingTest")//注册bean
public class BeanNameUrlHandlerMapping implements Controller {接口方法}
SimpleUrlHandlerMapping(静态资源/controller级别的使用),非单例,可以在容器中存在多个对象
@Bean//自定义SimpleUrlHandlerMapping对象进ioc容器
public SimpleUrlHandlerMapping simpleUrlHandlerMapping(){
SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping();
Properties properties = new Properties();
properties.setProperty("simpleUrlHandlerMapping1","simpleUrlHandlerMappingController");//这里可以配置多对多
simpleUrlHandlerMapping.setMappings(properties);
//设置该handlermapping的优先级为1,否则会被默认的覆盖,导致访问无效
simpleUrlHandlerMapping.setOrder(1);
return simpleUrlHandlerMapping;
}
@Component("/simpleUrlHandlerMappingController")//注册bean
public class SimpleUrlHandlerMappingController implements Controller {接口方法}


当访问配置中匹配不到url时,找到的Handler就是ResourceHttpRequestHandler,相应的HandlerAdapter为HttpRequestHandlerAdapter,DispatcherServlet会使用HttpRequestHandlerAdapter执行ResourceHttpRequestHandler加载静态资源返回给请求者,没有后续视图解析和渲染的过程
一个url对应一个Controller