DispatcherServlet的初始化

本文详细解析了DispatcherServlet的初始化过程,从WEB.xml配置开始,依次介绍了父类的init方法、初始化Spring IOC容器、设置DispatcherServlet的各个解析器、初始化HandlerMappings、HandlerAdapters以及HandlerExceptionResolvers。整个初始化流程涉及到了Spring MVC的核心组件配置和对象的创建与绑定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看流程图
在这里插入图片描述
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.大体是这样,这里不继续跟踪了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bruk_spp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值