Spring Mvc源码剖析
Posted 怀瑾Hello World
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Mvc源码剖析相关的知识,希望对你有一定的参考价值。
1.Spring Mvc执行源码分析
待补充(赶进度,后面根据讲义梳理补充吧/(ㄒoㄒ)/~~)
2.父子容器初始化
2.1.为什么需要父子容器?
为了容器之间的隔离.因为spring不仅可以集成springMvc还可以集成其他优秀的框架,子容器中持有父容器的引用,可以获取到父容器中的对象.
2.2.代码调试观察源码
父容器(其实就是spring容器):通过监听器加载
- web.xml中配置监听器,指定spring的配置文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext*.xml</param-value>
</context-param>
<!--spring框架启动-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
- 服务启动时监听器会加载配置文件,创建spring ioc容器。执行关键链路如下(懒得截图调试源码了,赶进度,后面有时间再补充吧/(ㄒoㄒ)/~~)
org.springframework.web.context.ContextLoader#initWebApplicationContext
…
org.springframework.context.ConfigurableApplicationContext#refresh
…
org.springframework.context.support.AbstractApplicationContext#refresh(这个就是分析spring源码时的最最最重要的方法,会创建spring ioc容器)
子容器(这里就是springmvc容器)
- web.xml配置前端控制器DispatcherServlet,指定SpringMvc的配置文件
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- 第一次访问DispatcherServlet会执行init方法,spring mvc容器初始化并持有父容器的引用,进行springmvc 九大组件初始化…
- 执行链路大致如下(赶进度,后面有时间再补充调试的截图)
org.springframework.web.servlet.HttpServletBean#init
org.springframework.web.servlet.FrameworkServlet#initServletBean
org.springframework.web.servlet.FrameworkServlet#initWebApplicationContext
org.springframework.web.servlet.FrameworkServlet#createWebApplicationContext
....
// 设置父容器
wac.setParent(parent);
String configLocation = getContextConfigLocation();
if (configLocation != null) {
wac.setConfigLocation(configLocation);
}
configureAndRefreshWebApplicationContext(wac);
org.springframework.web.servlet.FrameworkServlet#configureAndRefreshWebApplicationContext
org.springframework.context.support.AbstractApplicationContext#refresh(熟悉吧…创建工厂,ioc容器的方法)
org.springframework.context.support.AbstractApplicationContext#finishRefresh
org.springframework.context.support.AbstractApplicationContext#publishEvent
org.springframework.context.event.SimpleApplicationEventMulticaster#multicastEvent
org.springframework.context.event.SimpleApplicationEventMulticaster#doInvokeListener
org.springframework.web.servlet.FrameworkServlet.ContextRefreshListener#onApplicationEvent
org.springframework.web.servlet.FrameworkServlet#onApplicationEvent
org.springframework.web.servlet.DispatcherServlet#onRefresh
org.springframework.web.servlet.DispatcherServlet#initStrategies
/**
* Initialize the strategy objects that this servlet uses.
* <p>May be overridden in subclasses in order to initialize further strategy objects.
*/
protected void initStrategies(ApplicationContext context) {
// 初始化sringmvc的九大组件
// 初始化文件解析器
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
// 初始化处理器映射器
initHandlerMappings(context);
// 初始化处理器适配器
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
// 初始化视图解析器
initViewResolvers(context);
// 闪存(数据会存到session中)
initFlashMapManager(context);
}
3.@RequestBody和@ResponseBody源码分析
调试源码时,可以看到请求参数转换的处理器和返回参数转换的处理器有指定对这两个注解进行处理的(待补充完善)
以上是关于Spring Mvc源码剖析的主要内容,如果未能解决你的问题,请参考以下文章
源码剖析Spring MVC如何将请求映射到Controller?