DispatcherServlet的处理流程:
- AbstractDispatcherServletInitializer 的 onStartup 调用 registerDispatcherServlet 方法
- 调用 createServletApplicationContext 抽象方法返回 WebApplicationContext 对象。
- createServletApplicationContext 方法的实现位于AbstractAnnotationConfigDispatcherServletInitializer类中。
- 先new AnnotationConfigWebApplicationContext 对象,再调用 register并将getServletConfigClasses 的返回值注册其中。getServletConfigClasses 是 AbstractAnnotationConfigDispatcherServletInitializer 的抽象方法。
- 返回 AnnotationConfigWebApplicationContext 实例的 WebApplicationContext 对象。
- 使用 WebApplicationContext 对象作为参数创建 DispatcherServlet 对象。
- 通过调用 ServletContext 对象的 addServlet 方法实现 DispatcherServlet 注册。
- addServlet 的返回值是 ServletRegistration.Dynamic。
- 调用到 ServletRegistration.Dynamic 对象的 addMapping。参数是 getServletMappings 抽象方法。
- 调用 getServletFilters 抽象方法返回 Filter[] 数组。
- 循环Filter[]数组,调用 registerServletFilter 进行注册Filter。ServletContext 对象的addFilter 方法注册Filter。
- 调用 customizeRegistration 抽象方法进行自定的注册。
ContextLoaderListener的处理流程:
- AbstractContextLoaderInitializer的 onStartup 调用 registerContextLoaderListener 方法开始注册 ContextLoaderListener。
- 调用 createRootApplicationContext 抽象方法返回 WebApplicationContext 对象。
- createRootApplicationContext 抽象方法的实现位于 AbstractAnnotationConfigDispatcherServletInitializer 类中。
- 先调用 AbstractAnnotationConfigDispatcherServletInitializer 抽象类的 getRootConfigClasses 抽象方法。
- 如果 getRootConfigClasses 返回的数组不为空,则创建 AnnotationConfigWebApplicationContext 对象。
- AnnotationConfigWebApplicationContext 对象调用 register 方法,参数为 getRootConfigClasses 的返回参数Class<?>[]。
- 最后返回 AnnotationConfigWebApplicationContext 实例化的对象,或者null。
- 如果返回值不为null,则用 WebApplicationContext 对象作为参数创建 ContextLoaderListener 对象。
- 调用 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.