在分析DispatcherServlet之前,我们先看下DispatcherServlet的继承关系
springmvc是主流的MVC框架,我先从使用开始一步一步解析其初始化过程,springmvc的核心是DispatcherServlet,它是前端控制器,负责拦截客户端发过来的请求,然后解析请求进行分发。
DispatcherServlet是基于Servlet的,所以使用springmvc先在web.xml中配置DispatcherServlet
上面说到在web容器启动时会会加载DispatcherServlet,每个Servlet在第一次加载时都会调用其init()方法,但是DispatcherServlet本身没有这个方法,所以系统会去它父类寻找init()方法,最后在HttpServletBean找到,调用,以下是init()方法源:码
一.HttpServletBean的init()方法
备注:
比如上面这段配置,传递了contextConfigLocation参数,之后构造BeanWrapper,这里使用BeanWrapper,有2个理由:
1. contextConfigLocation属性在FrameworkServlet中定义,HttpServletBean中未定义
2. 利用Spring的注入特性,只需要调用setPropertyValues方法就可将contextConfigLocation属性设置到对应实例中,也就是以依赖注入的方式初始化属性。
然后设置DispatcherServlet中的contextConfigLocation属性(FrameworkServlet中定义)为web.xml中读取的contextConfigLocation参数,该参数用于构造SpringMVC容器上下文。
总结HttpServletBean的作用:
首先:获取web.xml的中配置DispatcherServlet的初始化参数,存放到一个参数容器 ServletConfigPropertyValues中,
其次:根据传进来的this创建对象包 裹者(BeanWrapper),本质上它就是DispatcherServlet
最后:通过bw.setPropertyValues(pvs, true);把参数设置到bw(即DispatcherServlet)里面去,最后调用子类的initServletBean()
二.FrameworkServlet的initServletBean()方法源码:
接下来看下initWebApplicationContext方法的具体实现逻辑:
接下来看创建springMVC 的ioc容器方法createWebApplicationContext(WebApplicationContext parent)
最后看下DispatcherServlet。
DispatcherServlet覆写了FrameworkServlet中的onRefresh方法:
总结
web应用启动时扫描web.xml文件,扫描到DispatcherServlet,对其进行初始化
调用DispatcherServlet父类的父类HttpServletBean的init()方法,把配置DispatcherServlet的初始化参数设置到DispatcherServlet中,调用子类FrameworkServlet的initServletBean()方法
initServletBean()创建springMVC容器实例并初始化容器,并且和spring父容器进行关联,使得mvc容器能访问spring容器里面的bean,之后调用子类DispatcherServlet的onRefresh(ApplicationContext context)方法
onRefresh(ApplicationContext context)进行DispatcherServlet的策略组件初始化工作,url映射初始化,文件解析初始化,运行适配器初始化等等。
Servlet的作用:
HttpServletBean
主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中。比如servlet标签的子标签init-param标签中配置的参数。FrameworkServlet
将Servlet与Spring容器上下文关联。其实也就是初始化FrameworkServlet的属性webApplicationContext,这个属性代表SpringMVC上下文,它有个父类上下文,既web.xml中配置的ContextLoaderListener监听器初始化的容器上下文。DispatcherServlet
初始化各个功能的实现类。比如异常处理、视图处理、请求映射处理等。