Spring MVC 之 DispatcherServlet 和 ContextLoaderListener 处理流程解析。

DispatcherServlet的处理流程:

  1. AbstractDispatcherServletInitializer 的 onStartup 调用 registerDispatcherServlet 方法
  2. 调用 createServletApplicationContext 抽象方法返回 WebApplicationContext 对象。
    1. createServletApplicationContext 方法的实现位于AbstractAnnotationConfigDispatcherServletInitializer类中。
    2. 先new AnnotationConfigWebApplicationContext 对象,再调用 register并将getServletConfigClasses 的返回值注册其中。getServletConfigClasses 是 AbstractAnnotationConfigDispatcherServletInitializer 的抽象方法。
    3. 返回 AnnotationConfigWebApplicationContext 实例的 WebApplicationContext 对象。
  3. 使用 WebApplicationContext 对象作为参数创建 DispatcherServlet 对象。
  4. 通过调用 ServletContext 对象的 addServlet 方法实现 DispatcherServlet 注册。
  5. addServlet 的返回值是 ServletRegistration.Dynamic。
  6. 调用到 ServletRegistration.Dynamic 对象的 addMapping。参数是 getServletMappings 抽象方法。
  7. 调用 getServletFilters 抽象方法返回 Filter[] 数组。
  8. 循环Filter[]数组,调用 registerServletFilter 进行注册Filter。ServletContext 对象的addFilter 方法注册Filter。
  9. 调用 customizeRegistration 抽象方法进行自定的注册。

ContextLoaderListener的处理流程:

  1. AbstractContextLoaderInitializer的 onStartup 调用 registerContextLoaderListener 方法开始注册 ContextLoaderListener。
  2. 调用 createRootApplicationContext 抽象方法返回 WebApplicationContext 对象。
    1. createRootApplicationContext 抽象方法的实现位于 AbstractAnnotationConfigDispatcherServletInitializer 类中。
    2. 先调用 AbstractAnnotationConfigDispatcherServletInitializer 抽象类的 getRootConfigClasses 抽象方法。
    3. 如果 getRootConfigClasses 返回的数组不为空,则创建 AnnotationConfigWebApplicationContext 对象。
    4. AnnotationConfigWebApplicationContext 对象调用 register 方法,参数为 getRootConfigClasses 的返回参数Class<?>[]。
    5. 最后返回 AnnotationConfigWebApplicationContext 实例化的对象,或者null。
  3. 如果返回值不为null,则用 WebApplicationContext 对象作为参数创建 ContextLoaderListener 对象。
  4. 调用 ServletContext 对象的 addListener 方法,参数为 ContextLoaderListener 对象。完成注册。

上面红色的方法都是 AbstractDispatcherServletInitializer 的抽象方法。绿色的方法是 AbstractAnnotationConfigDispatcherServletInitializer 的抽象方法。蓝色方法是 AbstractContextLoaderInitializer类的抽象方法。

 

AbstractAnnotationConfigDispatcherServletInitializer的结构

Spring MVC 之 DispatcherServlet 和 ContextLoaderListener 处理流程解析。

从子类往父类的顺序分析每个类的功能:

  • AbstractAnnotationConfigDispatcherServletInitializer:主要负责把 getServletConfigClasses 和 getRootConfigClasses 返回的配置类创建为 WebApplicationContext为接口的AnnotationConfigWebApplicationContext对象。
  • AbstractDispatcherServletInitializer:通过getServletConfigClasses配置,并创建的WebApplicationContext对象去注册DispatcherServlet,,同事注册Filter,还有用户自定义的注册customizeRegistration.
  • AbstractContextLoaderInitializer:通过getRootConfigClasses 配置创建的WebApplicationContext去注册ContextLoaderListener
  • WebApplicationInitializer:就一个接口onStartup,启动serverlet.