SpringMVC DispatcherServlet 启动和加载过程(源码调试)

============分隔线==========================

 

在使用 SpringMVC 进行 Web 开发时,通常在 web.xml 中配置的 Servlet  都是 org.springframework.web.servlet.DispatcherServlet,那这个 DispatcherServlet 又是如何被 Tomcat 容器(或者其它容器)启动并加载进来的呢?

带着这个问题,写了个简单Demo进行源码调试。

Demo代码地址:https://github.com/cyhbyw/springMVC_atguigu_TongGang

Demo代码工程:springMVC_DebugSourceCode

 

首先从静态代码的角度,可以看到 DispatcherServlet 类的承继结构如下图所示

HttpServlet 及以上部分是 Servlet 标准中提供的接口及类

DispatcherServlet、FrameworkServlet、HttpServletBean 三者是 SpringMVC 提供的类,且后者依次分别是前者的父类

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

 

现在开始源码调试:

首先调用了 DispatcherServlet 的构造函数,并且从堆栈信息中可以看出,这是由 Tomcat 调用的

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

接下来当然是调用父类 FrameworkServlet 的构造函数

 

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

构造函数完成后,调用 Servlet 生命周期的 init() 方法;

提示,此处是 HttpServletBean 中的 init() 方法重载了GenericServlet中的 init() 方法;

这就是之前说的,建议重载这个空的 init() 方法而不建议重载那个 init(ServletConfig config) 方法,看来 SpringMVC 也确实是这样做的;

接下来代码走到 Line136行,初始化容器Bean

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

 接下来代码走到 Line493 行,初始化Web应用上下文

 

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

 接下来代码走到 Line552 行,创建Web应用上下文

 

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

获取到需要创建的Bean的Class

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

直接调用 getContextClass() 方法

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

而它内置的 contextClass 其实就是 XmlWebApplicationContext

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

 XmlWebApplicationContext 的继承结构如下图所示,不用说,肯定也是 ApplicationContext 家庭中的成员

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

Line627 行就实例化了 XmlWebApplicationContext 

同时,代码会走到 Line633 行,配置并刷新Web应用上下文

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

Line655 添加了一个应用监听器;(重要,后面会取出来用到)

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyxwj.html