SpringMvc的执行流程

本文介绍了Spring MVC的执行流程,从DispatcherServlet的初始化到请求分发,再到HandlerMethod的注册。Spring MVC首先通过DispatcherServlet进行请求分发,接着初始化九大组件,包括HandlerMapping。在分发处理流程中,它获取匹配的HandlerMethod并由适配器处理请求。最后,文章还探讨了Controller方法如何作为handlerMethod注册到MappingRegistry中。
摘要由CSDN通过智能技术生成

Spring MVC 是什么

SpringMVC 全名叫 Spring Web MVC,是⼀种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级Web 框架 。

SpringMvc开发web是非常方便的,那么它在背后做了什么工作呢?为什么咱们传统的servlet开发,几乎在spring中屏蔽了,只需要配置@Controller、@RequestMapping这些注解就能做业务逻辑开发呢?对于源码的阅读能让咱们理解这些方法。

DispatcherServlet源码阅读

要使用springmvc,必须要在web.xml中配置DispatcherServlet请求分发

<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath*:springmvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

先看看DispatcherServlet的类图结构,DispatcherServlet也是一个特殊的Servlet,它接管了请求,然后对每个请求进行分发处理。

DispatcherServlet类图关系

spring九大组件的初始化

因为DispatcherServlet的分发需要使用到九大组件,所以咱了解下这些组件时怎么初始化的。
众所周知,Servlet的生命周期分别为:init(),service(),destory()三个阶段。DispatcherServlet的init方法在org.springframework.web.servlet.HttpServletBean#init()中

public final void init() throws ServletException {
   
		// 核心调用方法
		initServletBean();
	}

然后调用org.springframework.web.servlet.FrameworkServlet#initServletBean()方法进行webApplicationContext的初始化

protected final void initServletBean() throws ServletException {
   

		try {
   
            // 初始化initWebApplicationContext
			this.webApplicationContext = initWebApplicationContext();
			initFrameworkServlet();
		}
		catch (ServletException | RuntimeException ex) {
   
			logger.error("Context initialization failed", ex);
			throw ex;
		}

	}

当初始化完成后,会执行org.springframework.context.support.AbstractApplicationContext#finishRefresh()方法,触发刷新事件,最终调用到DispatcherServlet#onRefresh方法

// 初始化策略
initStrategies(context);

即初始化SpringMvc的九大组件

protected void initStrategies(ApplicationContext context) {
   
		// 多文件上传的组件
		initMultipartResolver(context);
		// 初始化本地语言环境
		initLocaleResolver(context);
		// 初始化模板处理器
		initThemeResolver(context);
		// 初始化HandlerMapping
		initHandlerMappings(context);
		// 初始化参数适配器
		initHandlerAdapters(context);
		// 初始化异常拦截器
		initHandlerExceptionResolvers(context);
		// 初始化视图预处理器
		initRequestToViewNameTranslator(context);
		// 初始化视图转换器
		initViewResolvers(context);
		// 初始化 FlashMap 管理器
		initFlashMapManager(context);
	}

着重关注下initHandlerMappings进行HandlerMapping的初始化

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

    // 检测所有的handlerMapping还是只需要“handlerMapping”bean
    if (this.detectAllHandlerMappings) {
   
        // Find all HandlerMappings in the ApplicationContext, in
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值