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

15 篇文章 0 订阅

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的结构

类继承结构

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

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

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值