SpringMVC之HandlerMapping

SpringMVC之HandlerMapping

HandlerMapping顾名思义,是处理器映射器,SpringMVC中配置的所有的HandlerMapping都维护在DispatcherServlett对象中的hadlerMappings属性中,在DispatcherServlet.doDispatch中打个断点,执行this.getHandlerMappings()语句可以得到所有的HandlerMapping
hadlerMappings属性
如果加了@EnableWebMvc注解,SpringMVC默认加载了四个HandlerMapping,分别为:RequestMappingHandlerMapping、BeanNameUrlHandlerMapping、RouterFunctionMapping、SimpleUrlHandlerMapping

  1. RequestMappingHandlerMapping:详细讲解
  2. BeanNameUrlHandlerMapping:扫描实现了Controller接口的处理器,将这些处理器的beanName作为url的匹配模板
  3. RouterFunctionMapping:
  4. SimpleUrlHandlerMapping:根据路径直接匹配,SpringMVC默认用这个映射器映射静态资源

RequestMappingHandlerMapping详解

RequestMappingHandlerMapping是SpringMVC中优先级最高且用的最多的一个处理器映射器,默认在WebMvcConfigurationSupport类中被加载,可以根据RequestMapping中的路径模板匹配
以下是RequestMappingHandlerMapping初始化核心代码

protected void initHandlerMethods() {
	// getCandidateBeanNames获取到的是Spring中所有bean的名称
	for (String beanName : getCandidateBeanNames()) {
		// 如果是一个处理器类 -> 去探测HandlerMethods
		if (beanType != null && isHandler(beanType)) {
			detectHandlerMethods(beanName);
		}
	}
	handlerMethodsInitialized(getHandlerMethods());
}
protected boolean isHandler(Class<?> beanType) {
	// 如果这个类上有@Controller注解或@RequestMapping注解,那么就是一个处理器类
	return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}
protected void detectHandlerMethods(Object handler) {
	Class<?> handlerType = (handler instanceof String ? obtainApplicationContext().getType((String) handler) : handler.getClass());
	if (handlerType != null) {
		Class<?> userType = ClassUtils.getUserClass(handlerType);
		// 找出处理器中被@RequestMapping标识的方法并转化为一个Mapping对象(包括方法对象,请求路径,请求方式等)
		Map<Method, T> methods = MethodIntrospector.selectMethods(userType, (MethodIntrospector.MetadataLookup<T>) method -> return getMappingForMethod(method, userType));
		// 将这些映射转换为HandlerMethod对象并注册
		methods.forEach((method, mapping) -> {
			Method invocableMethod = AopUtils.selectInvocableMethod(method, userType);
			registerHandlerMethod(handler, invocableMethod, mapping);
		});
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值