springMvc 的初始化流程;

本文详细解析了Spring MVC框架启动及初始化的过程。介绍了DispatcherServlet如何作为前端控制器接收并分发客户端请求,以及如何通过初始化参数配置Spring MVC容器上下文。

在分析DispatcherServlet之前,我们先看下DispatcherServlet的继承关系
这里写图片描述

springmvc是主流的MVC框架,我先从使用开始一步一步解析其初始化过程,springmvc的核心是DispatcherServlet,它是前端控制器,负责拦截客户端发过来的请求,然后解析请求进行分发。
DispatcherServlet是基于Servlet的,所以使用springmvc先在web.xml中配置DispatcherServlet

这里写图片描述

上面说到在web容器启动时会会加载DispatcherServlet,每个Servlet在第一次加载时都会调用其init()方法,但是DispatcherServlet本身没有这个方法,所以系统会去它父类寻找init()方法,最后在HttpServletBean找到,调用,以下是init()方法源:码

一.HttpServletBean的init()方法
这里写图片描述

备注:
比如上面这段配置,传递了contextConfigLocation参数,之后构造BeanWrapper,这里使用BeanWrapper,有2个理由:
1. contextConfigLocation属性在FrameworkServlet中定义,HttpServletBean中未定义
2. 利用Spring的注入特性,只需要调用setPropertyValues方法就可将contextConfigLocation属性设置到对应实例中,也就是以依赖注入的方式初始化属性。
然后设置DispatcherServlet中的contextConfigLocation属性(FrameworkServlet中定义)为web.xml中读取的contextConfigLocation参数,该参数用于构造SpringMVC容器上下文。

总结HttpServletBean的作用:
首先:获取web.xml的中配置DispatcherServlet的初始化参数,存放到一个参数容器 ServletConfigPropertyValues中,
其次:根据传进来的this创建对象包 裹者(BeanWrapper),本质上它就是DispatcherServlet
最后:通过bw.setPropertyValues(pvs, true);把参数设置到bw(即DispatcherServlet)里面去,最后调用子类的initServletBean()

二.FrameworkServlet的initServletBean()方法源码:

这里写图片描述

接下来看下initWebApplicationContext方法的具体实现逻辑:
这里写图片描述
这里写图片描述

接下来看创建springMVC 的ioc容器方法createWebApplicationContext(WebApplicationContext parent)
这里写图片描述

最后看下DispatcherServlet。
DispatcherServlet覆写了FrameworkServlet中的onRefresh方法:
这里写图片描述

总结
web应用启动时扫描web.xml文件,扫描到DispatcherServlet,对其进行初始化
调用DispatcherServlet父类的父类HttpServletBean的init()方法,把配置DispatcherServlet的初始化参数设置到DispatcherServlet中,调用子类FrameworkServlet的initServletBean()方法
initServletBean()创建springMVC容器实例并初始化容器,并且和spring父容器进行关联,使得mvc容器能访问spring容器里面的bean,之后调用子类DispatcherServlet的onRefresh(ApplicationContext context)方法
onRefresh(ApplicationContext context)进行DispatcherServlet的策略组件初始化工作,url映射初始化,文件解析初始化,运行适配器初始化等等。

Servlet的作用:

  1. HttpServletBean
      主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中。比如servlet标签的子标签init-param标签中配置的参数。

  2. FrameworkServlet
      将Servlet与Spring容器上下文关联。其实也就是初始化FrameworkServlet的属性webApplicationContext,这个属性代表SpringMVC上下文,它有个父类上下文,既web.xml中配置的ContextLoaderListener监听器初始化的容器上下文。

  3. DispatcherServlet
      初始化各个功能的实现类。比如异常处理、视图处理、请求映射处理等。

### Spring MVC 初始化流程详解 Spring MVC 的初始化流程是一个复杂的过程,涉及多个核心组件的加载和配置。以下是对其初始化流程的具体说明: #### 1. DispatcherServlet 加载 `DispatcherServlet` 是 Spring MVC 中的核心前端控制器,在应用程序启动时会自动被加载。它的加载依赖于 `web.xml` 文件中的 `<servlet>` 和 `<servlet-mapping>` 配置[^1]。 当 Web 容器(如 Tomcat)启动时,`DispatcherServlet` 会被实例化并触发其初始化逻辑。这个过程主要包括以下几个阶段: - **读取配置文件**:默认情况下,`DispatcherServlet` 会在路径下寻找名为 `[servlet-name]-servlet.xml` 的配置文件。如果未找到该文件,则抛出异常。 - **创建上下文环境**:`DispatcherServlet` 创建一个独立的 `WebApplicationContext` 实例,并将其与根上下文(由 `ContextLoaderListener` 或者 `AnnotationConfigWebApplicationContext` 提供)关联起来[^3]。 #### 2. 注册 BeanDefinition 并扫描组件 在 `DispatcherServlet` 初始化完成后,Spring 开始注册各种 BeanDefinition 到 IoC 容器中。这一部分工作主要分为两步: - **Bean 扫描**:通过指定的基础包路径(通常是通过 `@ComponentScan` 注解或者 XML 配置实现),Spring 自动发现所有标注了特定注解(如 `@Controller`, `@Service` 等)的并将它们注册为 Bean。 - **自定义 Bean 定义**:开发者可以在 XML 配置文件或 Java Config 中手动声明额外的 Bean,这些也会在此阶段加入到容器中[^5]。 #### 3. 构建 URL 映射表 (HandlerMapping) URL 请求与具体处理器之间的映射关系是由一系列实现了 `HandlerMapping` 接口的对象维护的。在初始化期间,Spring 会按照优先级顺序依次尝试匹配不同的 `HandlerMapping` 实现,直到成功为止。常见的 `HandlerMapping` 包括但不限于: - **RequestMappingHandlerMapping**:用于处理基于 `@RequestMapping` 及其衍生注解的方法级别映射。 - **SimpleUrlHandlerMapping**:支持简单的字符串形式的 URL 路径映射[^2]。 每种型的 `HandlerMapping` 对象都会构建自己的内部缓存结构——即存储着从 URL 模式到目标 handler 方法之间的一一对应关系的数据结构。 #### 4. 处理器适配器 (HandlerAdapter) 的准备 即使有了清晰的 URL-to-handler 映射规则,还需要一种机制能够实际调用对应的 controller 方法。这就是为什么需要引入 `HandlerAdapter` 这样的概念的原因所在。简单来说,每一个可能成为 handler 的对象都需要有一个专门为其定制的服务代理来完成真正的业务操作执行任务。 对于标准的 spring mvc 应用而言,默认已经内置了几种常用的 adapter ,比如针对 annotation driven controllers 设计出来的 RequestMappingHandlerAdapter 。当然也允许扩展新的 Adapter 来满足特殊需求场景下的功能开发诉求。 --- ```java // 示例代码展示如何配置 DispatcherServlet public class MyWebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) throws ServletException { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(AppConfig.class); ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(ctx)); servlet.setLoadOnStartup(1); servlet.addMapping("/"); } } ``` --- ### 总结 综上所述,Spring MVC 的初始化流程涵盖了从基础设置到高级特性的全面覆盖,包括但不限于 dispatcher servlet 启动、bean factory 填充以及 url-pattern 解析等多个重要环节。只有充分理解上述各个组成部分及其相互作用原理才能更好地利用 framework 提供的强大特性去构建高效稳定的应用程序体系架构[^1].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值