springmvc路由机制:RequestMappingHandlerMapping的注入

1.springmvc中 请求url 什么时候解析的
参考链接1
参考链接2
在springmvc中,如何根据url找到controller以及对应方法,依赖的是HandlerMapping接口的getHandler方法

在Spring MVC框架中,路由机制是实现HTTP请求\到\具体处理器方法\映射的核心。

路由机制实现核心 HandlerMapping

在spring容器中默认注册的HandlerMapping有以下五种:

RequestMappingHandlerMapping
BeanNameUrlHandlerMapping
SimpleUrlHandlerMapping
RouterFunctionMapping
WelcomePageHandlerMapping

1.Spring中RequestMappingHandlerMapping的注入

过程:

1.在springmvc中,使用注解需要在xml了加入注解声明

<!-- 注解扫描 -->
<context:component-scan base-package="com.xiaofan"/>
<!--使用mvc注解声明  -->
<mvc:annotation-driven/>

2.启动web服务器,我用的是tomcat8

3.spring启动,注册BeanDefinition,spring会扫描xml文件,将配置文件中的bean信息注册成BeanDefinition,当发现springmvc的xml配置文件中有annotation-driven标签时,会调用AnnotationDrivenBeanDefinitionParser来解析该标签

@Override
	@Nullable
	public BeanDefinition parse(Element element, ParserContext context) {
		...
		// 前面省略代码
		RootBeanDefinition handlerMappingDef = new RootBeanDefinition(RequestMappingHandlerMapping.class);
		handlerMappingDef.setSource(source);
		handlerMappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
		handlerMappingDef.getPropertyValues().add("order", 0);
		handlerMappingDef.getPropertyValues().add("contentNegotiationManager", contentNegotiationManager);

		if (element.hasAttribute("enable-matrix-variables")) {
			Boolean enableMatrixVariables = Boolean.valueOf(element.getAttribute("enable-matrix-variables"));
			handlerMappingDef.getPropertyValues().add("removeSemicolonContent", !enableMatrixVariables);
		}

		configurePathMatchingProperties(handlerMappingDef, element, context);
		// String HANDLER_MAPPING_BEAN_NAME = RequestMappingHandlerMapping.class.getName()
		readerContext.getRegistry().registerBeanDefinition(HANDLER_MAPPING_BEAN_NAME, handlerMappingDef);
		// 后面省略代码
		...
		return null;
	}

4.spring将BeanDefinition通过反射实例化成bean注入到容器中
那么问题来了,如果没有mvc:annotation-driven标签,RequestMappingHandlerMapping还会被注入到spring容器中吗?
答:会的,前提是xml中没有配置任何一个HandlerMapping。
过程如下:

在启动过程中,会调用DispatcherServlet的onRefresh()方法
DispatcherServlet#onRefresh → DispatcherServlet#initStrategies → DispatcherServlet#initHandlerMappings

private void initHandlerMappings(ApplicationContext context) {
		...
		// 前面省略代码
		// 当没有配置任何handlerMapping时,则使用默认的handlerMapping
		if (this.handlerMappings == null) {
			// 从DispatcherServlet.properties拿org.springframework.web.servlet.HandlerMapping
			// 所以默认的有BeanNameUrlHandlerMapping和RequestMappingHandlerMapping
			// 最终还是调用BeanFactory#createBean()生成实例
			this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class);
			if (logger.isTraceEnabled()) {
				logger.trace("No HandlerMappings declared for servlet '" + getServletName() +
						"': using default strategies from DispatcherServlet.properties");
			}
		}
	}

2.SpringBoot中RequestMappingHandlerMapping的注入

在springboot中的注入,依赖的是springboot的自动装配

过程

1.spring-boot-autoconfigure包下的spring.factories中有WebMvcAutoConfiguration

2.WebMvcAutoConfiguration的内部类EnableWebMvcConfiguration#requestMappingHandlerMapping()

		protected RequestMappingHandlerMapping createRequestMappingHandlerMapping() {
			if (this.mvcRegistrations != null) {
				RequestMappingHandlerMapping mapping = this.mvcRegistrations.getRequestMappingHandlerMapping();
				if (mapping != null) {
					return mapping;
				}
			}
			return super.createRequestMappingHandlerMapping();
		}

3. servlet加载到容器:加载流程

servlet.init()->GenericServlet.init()->HttpServletBean.init->FrameworkServlet.initServletBean()->DisPatchServlet.onRefresh(rootContext)
这个流程用来绑定
handlerMappings
handlerAdapters

5.什么是请求映射?

在SpringMVC中,请求映射是一种将URL请求映射到处理方法(Controller方法)的机制。它使得开发者可以根据URL的不同部分,如路径、请求方法、请求参数等,将请求导航到不同的Controller方法,以执行相应的业务逻辑。

请求映射的主要作用包括:
路由请求:将HTTP请求路由到特定的Controller方法,以执行相关操作。
参数解析:解析URL中的参数,将它们传递给Controller方法进行处理。
请求方法匹配:根据HTTP请求的方法(GET、POST、PUT、DELETE等)来匹配相应的Controller方法。
多视图支持:允许根据请求URL选择不同的视图模板。
RESTful风格支持:支持RESTful风格的URL设计,将URL映射到不同的资源操作。
原文链接:https://blog.csdn.net/u013749113/article/details/133487716

  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值