Spring Boot 2.2.6 源码之旅二十SpringMVC源码之DispatcherServlet初始化二

本文深入解析SpringBoot2.2.6版本中SpringMVC的源码,重点介绍了DispatcherServlet的初始化过程,包括initThemeResolver和initHandlerMappings的实现细节。详细分析了如何从容器中获取多个HandlerMapping实例,并展示了这些实例的来源,如RequestMappingHandlerMapping、WelcomePageHandlerMapping等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring Boot 2.2.6 源码之旅二十SpringMVC源码之DispatcherServlet初始化二

基本流程图,方便查看

在这里插入图片描述

initThemeResolver

这个跟前面讲initLocaleResolver一样,最后获取默认的。

initHandlerMappings

这个获取处理器映射器就不一样啦,因为可能有多个,首先去容器里取HandlerMapping类型的多个实例,这个是取的到的,因为自动配置中配置了一些,如果没取到才会去找默认的:


public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";

private void initHandlerMappings(ApplicationContext context) {
		this.handlerMappings = null;

		if (this.detectAllHandlerMappings) {//可以找多个
			// Find all HandlerMappings in the ApplicationContext, including ancestor contexts.
			Map<String, HandlerMapping> matchingBeans =
					BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);
			if (!matchingBeans.isEmpty()) {
				this.handlerMappings = new ArrayList<>(matchingBeans.values());
				// We keep HandlerMappings in sorted order.
				AnnotationAwareOrderComparator.sort(this.handlerMappings);
			}
		}
		else {//只能找一个
			try {
				HandlerMapping hm = context.getBean(HANDLER_MAPPING_BEAN_NAME, HandlerMapping.class);
				this.handlerMappings = Collections.singletonList(hm);
			}
			catch (NoSuchBeanDefinitionException ex) {
				// Ignore, we'll add a default HandlerMapping later.
			}
		}

		// Ensure we have at least one HandlerMapping, by registering
		// a default HandlerMapping if no other mappings are found.
		if (this.handlerMappings == null) {
			this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class);
			if (logger.isTraceEnabled()) {
				logger.trace("No HandlerMappings declared for servlet '" + getServletName() +
						"': using default strategies from DispatcherServlet.properties");
			}
		}
	}

最后拿到了5个:
在这里插入图片描述

都是哪来的

我们看看这些是怎么来的,其实都是自动配置里的EnableWebMvcConfiguration中的。
WebMvcAutoConfigurationEnableWebMvcConfigurationRequestMappingHandlerMapping
在这里插入图片描述
WebMvcAutoConfigurationEnableWebMvcConfigurationWelcomePageHandlerMapping
在这里插入图片描述
WebMvcAutoConfigurationEnableWebMvcConfiguration的父类WebMvcConfigurationSupportBeanNameUrlHandlerMapping
在这里插入图片描述
WebMvcAutoConfigurationEnableWebMvcConfiguration的父类WebMvcConfigurationSupportRouterFunctionMapping
在这里插入图片描述
WebMvcAutoConfigurationEnableWebMvcConfiguration的父类WebMvcConfigurationSupportSimpleUrlHandlerMapping
在这里插入图片描述

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值