在 Spring MVC 中,DispatcherServlet
的生命周期并不完全由 Spring IoC 容器管理,而是由 Servlet 容器(如 Tomcat、Jetty 等)管理。不过,DispatcherServlet
的初始化过程会与 Spring IoC 容器进行交互,以加载和配置 Spring MVC 相关的组件和 Bean。以下是 DispatcherServlet
的生命周期的关键点:
1. 加载和初始化
- Servlet 容器启动:当 Servlet 容器(如 Tomcat)启动时,它会读取
web.xml
文件(或基于 Java 配置的等效配置)。 DispatcherServlet
注册:在web.xml
中,DispatcherServlet
被注册为一个 Servlet。容器会创建DispatcherServlet
的实例。- 初始化:容器调用
DispatcherServlet
的init()
方法。在这个方法中,DispatcherServlet
会执行以下操作:- 加载 Spring 配置:
DispatcherServlet
会加载 Spring MVC 配置文件(通常是applicationContext.xml
或基于 Java 的配置类)。 - 创建 Spring IoC 容器:
DispatcherServlet
会创建一个 Spring IoC 容器(WebApplicationContext
),用于管理 Spring MVC 相关的 Bean。 - 初始化组件:
DispatcherServlet
会初始化 Spring MVC 的核心组件,如HandlerMapping
、HandlerAdapter
、ViewResolver
等。
- 加载 Spring 配置:
2. 请求处理
- 接收请求:当客户端发送 HTTP 请求时,Servlet 容器会将请求转发给
DispatcherServlet
。 - 处理请求:
DispatcherServlet
会调用 Spring MVC 的组件来处理请求,包括:- 查找处理器:通过
HandlerMapping
查找能够处理该请求的控制器方法。 - 调用处理器:通过
HandlerAdapter
调用控制器方法。 - 处理返回值:将控制器方法的返回值转换为视图。
- 查找处理器:通过
3. 销毁
- 容器关闭:当 Servlet 容器关闭时,它会调用
DispatcherServlet
的destroy()
方法。 - 清理资源:在
destroy()
方法中,DispatcherServlet
会清理相关资源,如关闭 Spring IoC 容器。
与 Spring IoC 容器的关系
WebApplicationContext
:DispatcherServlet
创建的WebApplicationContext
是 Spring IoC 容器的一个子容器,专门用于管理 Web 层的 Bean。- 父容器:
WebApplicationContext
通常有一个父容器,通常是根容器(由ContextLoaderListener
创建),用于共享应用范围的 Bean。
总结
DispatcherServlet
的生命周期主要由 Servlet 容器管理,但在其初始化过程中会与 Spring IoC 容器进行交互,以加载和配置 Spring MVC 相关的组件和 Bean。DispatcherServlet
是 Spring MVC 的入口点,负责协调 Spring MVC 的各个组件来处理 HTTP 请求。