先看流程图
1.首先在WEB.xml里面配置的是DispatherServlet,所以起点是以DispatcherServlet对象.而这个对象又是frameworkServlet和HttpServletBean的子类也是java 的servlet子类
初始化的起点是其父类的init方法.截图看方法的实现
代码比较简洁.首先是看servle里面是否含有property配置,如果有则拿过来.然后直接调用initServletBean()方法.
2.
这个函数比较简单就一调用传递.initFrameworkservlet是个空函数
3.
首先是为rootContext赋值,值的来源为:其启动配置对象中有没有一个叫
org.springframework.web.context.WebApplicationContext.ROOT的属性.如果有则读取赋值给它.这个值是spring IOC容器的上下文对象,我们可以看到经过几个判断后有个cwac.setParent(rootContext);调用,这就是为springmvc设置了其父类,getBean时会先从其父类找.实现对象数据的共享.
如果上面wac上下文没初始化成功.则看有没有contextAttribute的属性注入.如果也没有则使用默认的XmlWebApplicationContext.class通过反射来创建实例.wac成功赋值后,会调用refresh来开始dispatcherservlet环境的ioc注入过程
3. IOC注入完成之后,就是DispatcherServlet的初始化了onRefresh的截图如下
其中initMultipartResolver函数调用是为multipartResolver赋值
initLocaleResolver函数调用是为localeResolver赋值
initThemeResolver函数调用是为themeResolver赋值
initRequestToViewNameTranslator函数调用是为viewNameTranslator赋值
initFlashMapManager函数调用是为flashMapManager.
以上几个函数调用都是调用getBean来获取对象.如果没有注入则为空了
至于这些成员变量的具体函数,没写过具体代码不太清楚.但是网上有很多资料介绍的
initHandlerMappings这是函数很重要的.其负责初化handlerMappings 这个map里面包括了所有 操作和处理键值对.根据其操作分配对应的对象去处理.所以我们如果想新增加对不同操作的不同处理,就要在这里增加了.看截图如何实现
那个高亮的函数就是这个map的数据来源.跟踪代码发现其思路主要就是
1.从dispatcherservlet的环境中,查找所有是HandlerMapping.class子类的bean.并返回beanid和Object的MAP.所以我们只要在IOC初始化时把继承HandlerMapping.class的处理类注册进bean就可以了
2.如果没找到的话.要去配置里面找些默认的消息处理类了
initHandlerAdapters和initHandlerExceptionResolvers初始方式跟handlerMapping一样.不再重复.到这里dispatcherServlet初始化结束.等侍java servlet的操作过来
servlet常用操作doget和dopost都是调用processRequest接口.看其实现源码
上面一大堆代码都是用来记录上次操作的相关数据.为finally准备的.结果如何跟doService没关系.我们只看流程,先不用关心这些是干嘛的.doService代码截图如下:
首先判断request的请求里面有没有javax.servlet.include.request_uri这个属性.如果有则在其属性里查找所有以org.springframework.web.servlet开头的属性,并存放到map中.
然后下面就是几个request属性的设置.基本都是默认值.然后就是直接doDispatch
doDispatch主要是从我们注册的HandlerMapping子类中根据其request的含有的javax.servlet.include.context_path属性来取得路径名,然后找出处理的Object.大体是这样,这里不继续跟踪了