Spring mvc 源码分析
一、 初始化分析
1. 实现来看DispatchServlet类的整体结构图如下所示
DispatchServlet 是一个java web标准中httpServlet的实现类,负责整个spring mvc的启动,入口,拦截请求,请求处理,结果返回,这是spring mvc的核心。通过类图关系我们先从上到下层层分析,揭开Spring mvc的神秘面纱。
2. HttpServletBean初始化过程
Init是由HttpServletBean 中的init()方法执行,这个方法有HttpServlet提供,HttpServletBean重写了HttpServlet中的init()方法,在HttpServletBean的init()方法中,调用父类的init()方法,并加入了initBeanWrapper(bw);这儿采用了两种设计模式:模板模式与装饰模式。我们来看HttpServletBean中的init()方法的源码:3. FrameworkServlet 是负责spring mvc容器的初始化,HttpServletBean的子类。我们找到模板方法:initServletBean();这个方法主要有两条语句:
this.webApplicationContext = initWebApplicationContext();
//初始化spring mvc的容易
initFrameworkServlet(); //并未实现,作为一个预留,也可以自定义去实现,那么可以做更多的初始化工作
在来看initWebApplicationContext()的具体实现,进入到这个方法中, 我们可以看到:
4. DispatchServlet 分析。
DispatchServlet中我们通过变量定义就是可以看到,这个类主要初始化,spring mvc的组件。进入onRefresh中, onRefresh调用了另外一个方法initStrategies();initStrategies()中提供了各个组件的初始化方法。
对于这个组件,我将分开来介绍。因为在此只是从配置的容器中找到这些组件,设置到DispatchServlet的变量中。至此,初始化的工作就完成了。
二、请求处理分析
请求处理的方法是有servlet 的Service分发,FramwordServlet重写了HttpServlet的Service的方法,并添加了装饰方法processRequest,processRequest中调用了doService方法,这个方式负责设置一些HttpServletRequest的参数,在DispatcherServlet中实现,最终落实到处理的方法是:
在doDispatch中,负责通过request找到RequestMapping, 进而找handleAdapter,我们看看源码:
最后到渲染视图,渲染视图的方法可以processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);这个方法中,在上图中,由于屏幕有限,并没有截出来。