============分隔线==========================
在使用 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 提供的类,且后者依次分别是前者的父类
现在开始源码调试:
首先调用了 DispatcherServlet 的构造函数,并且从堆栈信息中可以看出,这是由 Tomcat 调用的
接下来当然是调用父类 FrameworkServlet 的构造函数
构造函数完成后,调用 Servlet 生命周期的 init() 方法;
提示,此处是 HttpServletBean 中的 init() 方法重载了GenericServlet中的 init() 方法;
这就是之前说的,建议重载这个空的 init() 方法而不建议重载那个 init(ServletConfig config) 方法,看来 SpringMVC 也确实是这样做的;
接下来代码走到 Line136行,初始化容器Bean
接下来代码走到 Line493 行,初始化Web应用上下文
接下来代码走到 Line552 行,创建Web应用上下文
获取到需要创建的Bean的Class
直接调用 getContextClass() 方法
而它内置的 contextClass 其实就是 XmlWebApplicationContext
XmlWebApplicationContext 的继承结构如下图所示,不用说,肯定也是 ApplicationContext 家庭中的成员
Line627 行就实例化了 XmlWebApplicationContext
同时,代码会走到 Line633 行,配置并刷新Web应用上下文
Line655 添加了一个应用监听器;(重要,后面会取出来用到)