1-1.DispatcherServlet的初始化
springIOC的初始化的完成要在DispatcherServlet的初始化完成之前
DispatcherServlet 本质上是一个 Servlet,所以天然的遵循 Servlet 的生命周期。所以宏观上是 Servlet
生命周期来进行调度。
(springMVC管理控制层,服务层由spring管理)
DispatcherServlet的初始化实现顺序
在GenericServlet中,实现了Servlet接口初始化方法,同时调用自身初始化方法
HttpServlet没有实现父类的初始化方法
HttpServletBean实现了GenericServlet的初始化方法,同时调用自身的initServletBean()初始化方法
FrameworkServlet实现HttpServletBean的初始化方法,
调用this.initWebApplicationContext();来初始化IOC容器
先判断当前IOC容器是不是null
如果是null,则调用this.findWebApplicationContext()寻找IOC容器
如果还找不到,依旧是null,则创造一个IOC容器
红框语句是真正创建springMVC的IOC容器的方法,BeanUtils.instantiateClass
绿框语句用来创建springMVC的IOC容器的父容器,这个父容器是spring的IOC容器
这样Spring IOC容器的组件就对SpringMVC IOC容器可见,这就是为什么Controller组件能够自动装配service组件(控制层由SpringMVC管理,其他层的组件由Spring管理)
子容器可以访问父容器,但父容器无法访问子容器
创建完后刷新IOC容器,该刷新方法由子类DispatcherServlet来实现
黄框语句获取当前IOC容器,并共享到最大的域对象ServletContext中
ServletContext.setAttribute(属性名,IOC对象);
DispatcherServlet实现父类FrameworkServlet的刷新容器方法
onRefresh调用初始化策略initStrategies来初始化SpringMVC的组件
1-2.DispatcherServlet处理请求过程
HttpServlet实现service方法,并调用自身的service方法去实现主要功能
FrameworkServlet使用service,当请求方式为PATCH或者为null时,就调用父类service处理
否则调用processRequest方法
当调用父类service方法时,由于FrameworkServlet重写了doGET、doPOST等响应对应请求的方法,
所以父类service调用doGET、doPOST等方法时,使用的是子类FrameworkServlet重写的方法
在FrameworkServlet中,无论是什么请求方式,最终都会调用processRequest方法
其中的doService方法是抽象方法,由DispatcherServlet来实现
在DispatcherServlet中,doService又调用了doDispatch方法来最终处理请求
最后processDispatchResult调用render渲染方法