一、概述

下面一个基本的运用springMVC的的web.xml的配置,这里要注意两个地方,一个是ContextLoadListener,一个是DispatcherServlet。web容器正是通过这两个配置才和Spring关联起来。这两个配置与web容器的ServletContext关联,为Spring的Ioc容器提供了一个宿主,在建立起Ioc容器体系之后,把DispatcherServlet作为Spring MVC处理web请求的转发器建立起来,从而完成响应Http请求的准备。

Spring MVC启动过程依据这两个配置大致分为两个过程:

1、ContextLoaderListener初始化,实例化IoC容器,并将此容器实例注册到ServletContext中。

2、DispatcherServlet初始化,建立自己的上下文,也注册到ServletContext中。

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/controllers.xml,/WEB-INF/service.xml</param-value>
</context-param>
<servlet>
  <servlet-name>dispatch</servlet>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
  </init-param>
</servlet>
<servlet-mapping>
  <servlet-name>dispatch</servlet-name>
  <servlet-pattern>*.*</servlet-pattern>
</servlet-mapping>
</web-app>

二、Spring IOC容器的启动

ContextLoaderListener实现ServletContextListener,这个接口里面的函数会结合web容器的生命周期被调用。因为ServletContextListener是ServletContext的监听者,如果ServletContext发生变化,会触发相应的事件,而监听者一直对这些事件进行监听,如果接受到了监听的事件,就会作出预先设计好的动作。例如在服务器启动,ServletContext被创建的时候,ServletContextListener的contextInitialized()方法被调用,从而拉开了初始化Spring IOC容器的大幕。

首先从Servlet的启动事件中得到ServletContext,然后读取web.xml中的各个相关的属性值,接着ContextLoader会实例化WebApplicationContext,并完成载入和初始化的过程,这个被初始化的第一个上下文作为根上下文而存在,这个根上下文载入后,被绑定到web应用程序的ServletContext上,这样,IOC容器中的类就可以在任何地方访问到了。

具体的Ioc容器的载入过程在refresh()中实现,这个方法主要干了以下几件事情:

(1)Resource文件的定位,即找到bean的配置文件
(2)通过特定的reader解析该bean配置文件,抽象成beanDefinition类
(3)将beanDefinition向容器注册,写入到一个大的HashMap中,供实例化请求的时候使用

三、DispatchServlet的启动

DispatchServlet本质上是一个Servlet,web容器启动的时候,servlet也会初始化,其init方法被调用,开启初始化之旅。

DispatchServlet会建立自己的上下文来持有Spring MVC特殊的bean对象,在建立这个自己持有的Ioc容器的时候,会从ServletContext中得到根上下文作为DispatchServlet上下文的parent上下文。有了这个根上下文,再对自己持有的上下文进行初始化,最后把自己持有的这个上下文保存到ServletContext中,供以后检索和使用。

在initWebApplicationContext中完成了对自己上下文的初始化,这里面也有一个refresh的过程,和普通的Ioc容器初始化大同小异。

另外一些MVC的特性初始化时在initStrategies()中实现的,包括支持国际化的LocalResolver、支持Request映射的HandlerMappings,以及视图生成的ViewResolver等等。

三、DispatcherServlet的分发处理Http请求

初始化完成后,上下文环境中已经定义的所有HandlerMapping都已经被加载了,这些被加载的HandlerMapping放在List中,存储着Http请求和Controller的映射数据。

DispatcherServlet是HttpServlet的子类,也是通过doService()来响应HTTP请求的,doService()中采用doDispatch()方法实现的。

(1)首先通过url匹配,通过getHandler找到Handler,Hander中封装了配置的Controller

(2)执行Handler,得到返回的ModelAndView结果

(3)最后把这个ModelAndView对象交给视图对象的render()方法去呈现。

参考资料:

《Spring技术内幕:深入解析Spring架构与设计原理》

http://spring.group.iteye.com/group/wiki/1226

Spring MVC的启动过程的更多相关文章

  1. Spring MVC 学习 -- 创建过程

    Spring MVC 学习 -- 创建过程 Spring MVC我们使用的时候会在web.xml中配置 <servlet> <servlet-name>SpringMVC< ...

  2. spring mvc之启动过程源码分析

    简介 这两个星期都在看spring mvc源码,看来看去还是还是很多细节没了解清楚,在这里把看明白的记录下,欢迎在评论中一起讨论. 一.铺垫 spring mvc是基于servlet的,在正式分析之前 ...

  3. spring MVC处理请求过程及配置详解

    本文主要梳理下Spring MVC处理http请求的过程,以及配置servlet及业务application需要的常用标签,及其包含的意义. spring MVC处理请求过程 首先看一个整体图 简单说 ...

  4. spring MVC处理请求过程

    spring MVC处理请求过程 首先看一个整体图 简单说下各步骤: handlerMapping handlerMapping将请求映射到处理器,即图中的HandlerExecutionChain. ...

  5. Spring Boot与Spring MVC集成启动过程源码分析

    开源项目推荐 Pepper Metrics是我与同事开发的一个开源工具(https://github.com/zrbcool/pepper-metrics),其通过收集jedis/mybatis/ht ...

  6. spring容器的启动过程

    spring的启动过程: 首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环 ...

  7. spring注解配置启动过程

    最近看起spring源码,突然想知道没有web.xml的配置,spring是怎么通过一个继承于AbstractAnnotationConfigDispatcherServletInitializer的 ...

  8. SpringBoot:Spring容器的启动过程

    一.简述 Spring的启动过程就是IoC容器的启动过程,本质上就是创建和初始化Bean的工厂(BeanFactory),BeanFactory是整个SpringIoC的核心,Spring使用Bean ...

  9. spring mvc 框架启动报错:nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal 解决办法

    今天准备将以前自己搭建的一个框架拿出来用一下,结果发现启动报错:nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/Elem ...

随机推荐

  1. c基础补充

    一:字符串在C语言中 字符串一般是动态分配和字符数组两种形式 动态分配的时候字符串字符串指针是4个字节 字符串的大小根据自己的需要来申请 比如: char * c://C为字符串指针 占用四个字节 c ...

  2. 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 3.全局防护Bypass之Base64Decode

    0x01 背景 现在的WEB程序基本都有对SQL注入的全局过滤,像PHP开启了GPC或者在全局文件common.php上使用addslashes()函数对接收的参数进行过滤,尤其是单引号.同上一篇,我 ...

  3. Python Learning

    这是自己之前整理的学习Python的资料,分享出来,希望能给别人一点帮助. Learning Plan Python是什么?- 对Python有基本的认识 版本区别 下载 安装 IDE 文件构造 Py ...

  4. LeetCode10 Regular Expression Matching

    题意: Implement regular expression matching with support for '.' and '*'. '.' Matches any single chara ...

  5. Java连接mysql数据库并进行内容查询

    最近用框架做了几个项目,感觉当初底层的东西有点忘了,写一个JDBC的简单的连接代码来熟悉回顾一下,也希望对刚接触的新手能有所帮助.这也是我的第一篇随笔,废话不多说,直接上代码: public Conn ...

  6. asp.net mvc 从数据库中读取图片的实现代码

    首先是创建一个类,继承于ActionResult,记住要引用System.Web.Mvc命名空间,如下: public class ImageResult : ActionResult { publi ...

  7. JSP起源、JSP的运行原理、JSP的执行过程

    JSP起源 在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变. 如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序 ...

  8. hdu 3450 树状数组

    思路:二分查找位置,之后是裸的树状数组. #include<set> #include<map> #include<cmath> #include<queue ...

  9. GSS5 spoj 2916. Can you answer these queries V 线段树

    gss5 Can you answer these queries V 给出数列a1...an,询问时给出: Query(x1,y1,x2,y2) = Max { A[i]+A[i+1]+...+A[ ...

  10. Fuck Sharepoint 2013

    最近遇到一个貌似是bug的问题,每次点击页面的时候页面的地址多出一行/_layouts/15/start.aspx#/ 然后跑到google上搜索出解决方案, 地址:http://social.tec ...