Spring MVC源码分析之请求分发

本文深入探讨Spring MVC的请求分发过程,从初始化Controller到DispatcherServlet的注册,再到请求进入DispatcherServlet并查找处理方法。通过源码分析,揭示了Spring MVC如何将请求映射到合适的Controller方法。
摘要由CSDN通过智能技术生成

前言

在使用SpringMvc时,通过ControllerRequestMapping,就能实现网络请求的处理。那么,这是怎么实现的呢?请求是如何从Tomcat进入到controller里的方法的呢?

核心流程概览

宏观上看,流程如下:

  1. 创建DispatcherServlet实例
  2. 创建Tomcat实例
  3. 通过ServletContainerInitializer以及ServletContextInitializerDispatcherServlet注册到TomcatServlet容器里
  4. HandlerMapping绑定到DispatcherServlet
  5. 请求通过Tomcat进到DispatcherServlet
  6. DispatcherServlet根据request pathHandlerMapping查找请求处理方法

源码分析

1. 注册controller

Spring在初始化RequestMappingHandlerMapping这个Bean时会将Controller层带有RequestMapping等相关注解的方法跟注解信息的PATH分别作为key value注册到RequestMappingHandlerMapping中。然后RequestMappingHandlerMapping会在第一次请求到来时被注册到DispatcherServlet

1.1 初始化RequestMappingHandlerMapping

RequestMappingHandlerMapping 继承了InitializingBean,在Spring创建RequestMappingHandlerMapping的实例时会去调用其afterPropertiesSet方法进行初始化

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
		implements AutowireCapableBeanFactory {

		protected void invokeInitMethods(String beanName, Object bean, @Nullable RootBeanDefinition mbd)
					throws Throwable {
				//判断当前bean是否继承了InitializingBean
				boolean isInitializingBean = (bean instanceof InitializingBean);
		
				if (isInitializingBean) {
					//初始化
					((InitializingBean) bean).afterPropertiesSet();
				}
			}
}
复制代码

1.2 遍历Controller

RequestMappingHandlerMapping会把所有的Spring Bean对应的类里有Controller或者RequestMapping注解的类拿出来处理

public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMapping implements InitializingBean {

		protected void processCandidateBean(String beanName) {
				Class<?> beanType = null;
				try {
					beanType = obtainApplicationContext().getType(beanName);
				}
				catch (Throwable ex) {
					...
				}
				//只处理有相应注解的bean
				if (beanType != null && isHandler(beanType)) {
					detectHandlerMethods(beanName);
				}
			}
		
		//判断是否有相应注解
		protected boolean isHandler(Class<?> beanType) {
				return (AnnotatedElementUtils.hasAnnotation(beanType, Controll
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值