SpringMVC的源码解析

  

学习java的人都知道春天,springMVC, mybatis等框架,像structs2这样的框架是基于servlet以外实现的,而springMVC是基于servlet容器实现的,

  

本文将分析SpringMVC的核心分发器DispatcherServlet的初始化过程以及处理请求的过程,让读者了解这个入口Servlet的作用。

  

在分析DispatcherServlet之前,我们先看下<强> DispatcherServlet的继承关系,

  

 SpringMVC的源码解析

  

HttpSerlvetBean继承自HttpServlet。

  

<强> HttpServletBean覆写了初始化方法,对初始化过程做了一些处理。以下是初始化的代码:

  

 SpringMVC的源码解析

  

首先,ServletConfigPropertyValues是HttpServletBean的静态类,构造过程会使用ServletConfig对象找出网络。xml文件中配置参数,并设置到ServletConfigPropertyValue,使用BeanWrapper来构造DispatcherServlet,获取ServletContextResourceLoader的资源加载器,然后注册资源编辑器,初始化BeanWrapper对象,设置DispatcherServlet属性,默认初始化ServletBean不做任何处理,子类覆盖该方法可以做任何事情,

  

以下是<强> web . xml 强文件配置:

  

 SpringMVC的源码解析

  

这段配置初始化参数为contextConfigLocation,后来构造的是BeanWrapper对象,由于contextConfigLocation在FrameworkServlet中定义,但是没有在HttpServletBean中定义,利用春天的注入特性,只需要调用setContextConfigLocation方法,就可以将contextConfigLocation设置到对应的实例当中,然后设置DispatcherServlet中contextConfigLocation (FrameworkServlet中定义)的属性,为web . xml读取contextConfigLocation参数,该资源文件用构造SpringMVC的容器的上下文。

  

下面看下FrameworkServlet这个类,FrameworkServlet继承自HttpServletBean。

  

以下是<强> initServletBean 强的代码:

  

 SpringMVC的源码解析

  

首先第一步是初始化WebApplicationContext,它是继承于ApplcationContext的接口,ApplcationContext是春容器的上下文,Servlet和春天容器关联的作用,然后初始化FrameWorkServlet,其实它空的,什么也做,子类重写这个方法,可以做任何处理,不过DispatcherServlet并重写这个方法。

  

下面是初始化<强> initWebApplicationContext 的具体实现逻辑:,

  

 SpringMVC的源码解析”>,,,,</p>
  <p>首先,得到根路径,DistpatcherServlet有个WebApplication为参数的构造函数,如果注入了WebApplication这个对象,就会执行上图代码。</p>
  <p> <img src=

  

FrameworkServlet中有个字符串类型的contextAttribute的变量名,以它为关键在ServletContextWebApplicationContext,一般不会设置,contextAttribute属性,也就说,wac开始是零;接下来就是创建WebApplicationContext,并设置根上下文为父上下文,然后配置ServletConfig, ServletContext等到这个上下文,这个类中有个函数onReFresh是一个模版方法,在WebApplication成功创建后就会调用,FrameworkServlet的实现类,就会重写这个方法,并将创建的容器上下文设置到ServletContext中,这里的根上下文是web . xml中配置的ContextLoaderListener监听器中根据contextConfigLocation路径生成的上下文。

  

 SpringMVC的源码解析

  

比如这段配置文件中根据类路径:- * . xml上下文下的xml文件生成的根上下文。

  

接着看一下DispatcherServlet重写了FrameworkServlet中onReFresh方法,

  

 SpringMVC的源码解析

  

可以看到initStrategies方法中,在初始化各种各种策略接口的实现类,后面再一一分析各个策略接口的实现的详细介绍。

  

<强>总结一个三个类的作用:

  

  

  

  

<强> DispatcherServlet请求处理过程:

  

先看下HttpServlet提供的方法用于处理请求,服务使用了模版模式,对于HttpServlet的得到请求,调用doGet方法,文章请求,调用doPost方法........

  

 SpringMVC的源码解析

SpringMVC的源码解析