Spring mvc 源码解析之初始化

来源:互联网 发布:上帝不会掷骰子 知乎 编辑:程序博客网 时间:2024/05/16 10:23

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()的具体实现,进入到这个方法中, 我们可以看到:


进入到configureAndRefreshWebApplicationContex()中与进入到createWebApplicationContext(),可以看到createWebApplicationContext()也是调用了configureAndRefreshWebApplicationContex()方法。这个地方在此提供了一个模板方法:onRefresh(wac);这个方法在DispatchServlet中实现。下面进入到DispatchServlet中,看onRefresh的实现。

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);这个方法中,在上图中,由于屏幕有限,并没有截出来。

原创粉丝点击