WormholeStack - Spring MVC
type: channel
link: https://www.wormholestack.com/tag/Spring-MVC/
items: Spring MVC 篇之请求处理流程
items: Spring MVC 篇之容器启动

Spring MVC 篇之请求处理流程
type: item
date: 2023-01-26T16:27:00+08:00
description: 本系列是针对 Spring-Framwork 5.1x 的源码分析文章已收录至精进Spring MVC系列 系列其它文章 https://www.wormholestack.com/tag/Spring-MVC/源码阅读环境：https://gitee.com/M-Analysis/source_springframwork5.1x 已填充关键注释建议阅读本篇前先阅读上篇文章《Spring MVC 篇之容器启动》1. Spring MVC 结构体系Spring MVC 框架是一个基于请求驱动的 Web 框架，并且也使用了前端控制器模式来进行设计，再根据请求映射 规则分发给相应的页面控制器（动作/处理器）进行处理。Spring MVC 为三层架构：表现层、业务层、持久层，MVC 是模型(model)，视图(view)，控制器(controller) 的缩写， 分层是为了解耦，解耦是为了每⼀层只编写⾃⼰的东⻄，不编写任何其他的代码，职责分明便于维护和分工。MVC 中每个部分各司其职：Model（模型）包含业务模型和数据模型，数据模型⽤于封装数据，业务模型⽤于处理业务。View（视图）通常指的就是我们的 jsp 或者 html。作⽤⼀般就是展示数据的。通常视图是依据模型数据创建的。Controller（控制器）是应⽤程序中处理⽤户交互的部分。作⽤⼀般就是处理程序逻辑的。2. 九大组件初始化上篇文章我们了解了 Spring MVC 父子容器的创建及初始化。其中也在子 Servlet 容器初始化的源码分析中提到了一嘴九大组件的初始化，不知道你还有没有印象，上篇文章说到在子 Servlet 容器启动后会发布一个完成事件，会触发广播分发事件，其中一个事件就是 SourceFilteringListener ，最终会调用DispatcherServlet 的 onRefresh 方法来注册九大组件。// DispatcherServlet.java @Nullable private MultipartResolver multipartResolver; @Nullable private LocaleResolver localeResolver; @Nullable private ThemeResolver themeResolver; @Nullable private List<HandlerMapping> handlerMappings; @Nullable private List<HandlerAdapter> handlerAdapters; @Nullable private List<HandlerExceptionResolver> handlerExceptionResolvers; @Nullable private RequestToViewNameTranslator viewNameTranslator; @Nullable private FlashMapManager flashMapManager; @Nullable private List<ViewResolver> viewResolvers; @Override protected void onRefresh(ApplicationContext context) { initStrategies(context); } // 初始化 Spring MVC 9大组件 protected void initStrategies(ApplicationContext context) { // 初始化 MultipartResolver initMultipartResolver(context); // 初始化 LocaleResolver initLocaleResolver(context); // 初始化 ThemeResolver initThemeResolver(context); // 初始化 HandlerMappings initHandlerMappings(context); // 初始化 HandlerAdapters initHandlerAdapters(context); // 初始化 HandlerExceptionResolvers initHandlerExceptionResolvers(context); // 初始化 RequestToViewNameTranslator initRequestToViewNameTranslator(context); // 初始化 ViewResolvers initViewResolvers(context); // 初始化 FlashMapManager i…

Spring MVC 篇之容器启动
type: item
date: 2023-01-24T19:59:00+08:00
description: 本系列是针对 Spring-Framwork 5.1x 的源码分析文章已收录至精进Spring MVC系列 系列其它文章 https://www.wormholestack.com/tag/Spring-MVC/源码阅读环境：https://gitee.com/M-Analysis/source_springframwork5.1x 已填充关键注释回忆杀-web.xml 时代早年间 Servlet + Spring MVC 的时代，那熟悉的 web.xml 配置，你还记得吗 <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 可以自定义servlet.xml配置文件的位置和名称，默认为WEB-INF目录下，名称为[<servlet-name>]-servlet.xml，如spring-servlet.xml --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-servlet.xml</param-value> // 默认 </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>【1】处，配置了 org.springframework.web.context.ContextLoaderListener 对象。这是一个 javax.servlet.ServletContextListener 对象，会初始化一个父 Root WebApplicationContext 容器。【2】处，配置了 org.springframework.web.servlet.DispatcherServlet 对象。这是一个 javax.servlet.http.HttpServlet 对象，它除了拦截我们制定的 *.do 请求外，也会初始化一个属于它的 Servlet WebApplicationContext 容器。并且这个容器是以【1】处的 父 Root 容器作为父容器。【1】和【2】分别会创建其对应的 WebApplicationContext 容器，并且它们是父子容器的关系。父子容器结构如下图所示WebApplicationContext 其实就是一个 IOC 容器，父 root WebApplicationContext 就是 Spring 容器，子 Servlet WebApplicationContext 就是 web mvc 容器。应用中可以包含多个 IOC 容器。DispatcherServlet 的创建的子容器主要包含 Controller、View Resolvers 等和 web 相关的一些 bean。父 root WebApplicationContex 主要包含包含一些基础的 bean，比如一些需要在多个 servlet 共享的 Dao、Service等 bean。如果在子容器中找不到 bean 的时候可以去父容器查找 bean，达到容器隔离的效果。父Root容器启动首先我们将关注点放到 ContextLoaderListener 对象上。ContextLoaderListener 实现 ServletContextListener 接口，所以它是一个监听器，在 Servlet 容器启动时，例如 Tomcat 启动时会触发回调机制，用回调机制执行 contextInitialized(ServletContextEvent event) 方法ContextLoaderListener 继承 ContextLo…