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