本篇为SpringMVC学习的第一篇,主要分析SpringMVC初始化的过程。

在分析SpringMVC初始化过程之前先复习下Servlet的生命周期,也就是Servlet从创建到销毁的整个过程。

      实例化->初始化->使用->销毁

     实例化:容器调用Servlet的构造器,创建一个Servlet对象;

     初始化:实例化之后,容器会立即调用对象的init方法;

     使用:调用servlet的service()方法处理客户端请求;

     销毁:调用servelet的destroy()方法销毁。

1.使用SpringMVC框架,我们需要在web.xml中配置spring框架的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>/WEB-INF/springmvc-servlet.xml</param-value>

    </init-param>

    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>

  </servlet-mapping>

org.springframework.web.servlet.DispatcherServlet作为请求的入口,其初始化过程是怎么样的呢?我们看源码逐步剖析

2.DispatcherServlet的init()

 首先看DispatcherServlet类与相关类的关系图,主要列出了spring框架自建的类,HttpServletBean继承自HttpServlet类并覆盖了init方法。下图只是列出了现在由此我们逐步分析DispatcherServlet的初始化。

由上类图关系我们可以看出,DispatcherServlet的初始化由HttpServletBean的init()方法开始。现在我们开始分析HttpServletBean的init()方法:

由init方法的代码中可以看到initServletBean()方法,该方法上注释Let subclasses do whatever initialization they like.翻译为中文就是让子类做任何它们想做的初始化工作。HttpServletBean中该方法为空实现。代码如下

方法的注释大致意思:子类为了实现个性化初始化可能需要重写这方法。这个servlet的所有属性将会在这个方法执行之前已经设置。这个默认实现是空的。

接下来我们看FrameworkServlet的initServletBean()。

FrameworkServlet的initServletBean()中调用了initWebApplicationContext()方法,该方法代码如下:

此方法是初始化和发布servlet的上下文,然后是调用onRefresh(wac)强制refresh上下文。onRefresh()方法如下

接着我们需要去DispatcherServlet看看onRefresh()方法,

接着我们去看initStrategies(context);

这里是DispatcherServlet的个性化初始化方法,该方法调用了DispatcherServlet内部的9个初始化方法,分别初始化不同的组件。

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐