Spring MVC DispatcherServlet启动过程原理分析

Spring MVC DispatcherServlet(前端控制器)继承关系架构

    •   FrameworkServlet

      •   该类是DispatcherServlet的父类。该类的initServletBean()方法是初始化DispatcherServlet的主要方法
    •   HttpServletBean

      •   该类是FrameworkServlet的父类。由于该类继承自HttpServlet的。所以该类也就是一个servlet。所以按照servlet的启动流程。初始化时就会执行init方法。

启动原理(源码跟踪)

首先明白MVC的启动过程分为两步。第一步时初始化根IOC容器。也就是我上一篇文章所写的内容。在根IOC容器启动完成后,才会初始化DispatcherServlet这个Ioc容器。由于DispatcherServlet是一个servlet。在一个web应用中,可以有多个servlet存在。所以在一个根上下文可以作为多个servlet上下文的双亲上下文。所以根上下文或作为DispatcherServlet这个servlet上下文的父类存在。

    1. 第一步。初始化serlvet,即调用HttpServletBean的init()方法。该方法中会获取servlet的初始化参数,也就是我们在web.xml中配置的<init-param>这个标签的属性和值。对bean的属性进行配置。如图
    2. 执行上图的initServletBean()方法。 该方法是由它的子类去进行具体的初始化。该方法就做了一件事。调用initWebApplicationContext()去初始化一个新的上下文。作为DispatcherServlet的上下文环境

    3. 执行initWebApplicationContext()方法,首先会获取根上下文。因为在初始化根上下文的时候,根上下文是存放在ServletContext中的。所以这里用WebApplicationContextUtils类的静态方法来获取。
      接着就是创建一个新的上下文wac,并且调用createWebApplicationContext()方法,在此方法的实现中,如果在web.xml中没有配置具体的上下文实现类。则spring会使用默认的实现类。也就是XmlWebApplicationContext

      同样这个参数也可以在web.xml配置,比如

      注意:这个标签必须要配在servlet标签的里面。因为这个是代表servlet的初始化参数

      然后初始化后就需要对设置父类的上下文配置。setParent()方法、setConfigLocation()方法。最后在执行configureAndRefreshWebApplicationContext()方法。这个方法就是同初始化根上下文的那个方法一样。都是给该上下文设置设置ServletContext、设置ConfigLocation等。最后调用refresh()方法初始化IoC容器。如图:

      这样。一个新的IOC容器也就建立完成了。

    4. 然后IOc创建完后,还要初始化MVC其他模块。比如支持国际化的LocaleResolver、支持HandlerMappings、以及视图生成的ViewResolvers等的初始化,如图:
    5. 好。这次就先记录到这。

猜你喜欢

转载自www.cnblogs.com/zl999/p/10053981.html