学习源码过程中,对各种context(上下文)表示很懵逼。特地留此一篇。

1.要了解各个上下文之间的关系。首先走一遍spring在web容器(tomcat)中的启动过程

a) ServletContext:  tomcat启动会创建一个ServletContext,作为全局上下文以及spring容器的宿主环境。当执行Servlet的init()方法时,会触发ServletContextListener的 public void contextInitialized(ServletContextEvent sce);方法

b)WebApplicationContext:  在web.xml(上图)中我们配置了ContextLoaderListener,该listener实现了ServletContextListener的contextInitialized方法用来监听Servlet初始化事件。

下图中红框部门的注释解释了该方法的作用。即初始化根上下文(即IOC容器),也就是WebApplicationContext。该类是一个接口类,其默认实现为XmlWebApplicationContext。

在initWebApplicationContext这个方法中进行了创建根上下文,并将该上下文以key-value的方式存储到ServletContext中

以WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE为key,this.context则为value。this.context就是刚才创建的根上下文。后面就可以通过这个ServletContext通过这个key获取该上下文了。而在web.xml中还有一对重要的标签

<context-param>该标签内的<param-name>的值是固定的原因在这张图上。该常量的值就是contextConfigLocation。通过该方法去寻找定义spring的xml文件。来初始化IOC容器的相关信息。

c) DispatcherServlet的上下文:  在WebApplicationContext初始化完后。开始初始化web.xml中的servlet。这个servlet可以有多个。默认我们都使用DispatcherServlet。<servlet>标签中可以有<init-param>标签用来配置一些DispatcherServlet的初始化参数。

该servlet初始化流程是有tomcat的Servlet的init()方法触发。DispatcherServleet-继承->FrameworkServlet-继承->HttpServletBean-继承-GenericServlet- 实现 ->Servlet。这样的一条关系链。其核心方法在FrameworkServlet中的initServletBean()中

中的initWebApplicationContext()方法中。

initWebApplicationContext()方法中的第一个红色框内就是去获取之前存在Servlet中的WebApplicationContext。通过上面说的WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE作为key

取到之后,设置为当前DispatcherServlet的父上下文。并且也把该上下文存在ServletContext中。方法如下

2.

a).   通过以上的流程,可以做到各个上下文之间既可以拥有自己独立的Bean,也可以访问各个Servlet相同的Bean

b). 通过init方法创建的dispatcherServlet上下文可以访问通过ServletContextListener中创建的WebApplicationContext上下文中的bean,反之则不行。因为WebApplicationContext是dispatcherServlet上下文的父容器。

3. api文档

Copyright ©2017 皇上吉祥

 
 
 
G
M
T
 
检测语言
世界语
中文简体
中文繁体
丹麦语
乌克兰语
乌兹别克语
乌尔都语
亚美尼亚语
伊博语
俄语
保加利亚语
僧伽罗语
克罗地亚语
冰岛语
加利西亚语
加泰罗尼亚语
匈牙利语
南非祖鲁语
卡纳达语
印地语
印尼巽他语
印尼爪哇语
印尼语
古吉拉特语
哈萨克语
土耳其语
塔吉克语
塞尔维亚语
塞索托语
威尔士语
孟加拉语
宿务语
尼泊尔语
巴斯克语
布尔语(南非荷兰语)
希伯来语
希腊语
德语
意大利语
意第绪语
拉丁语
拉脱维亚语
挪威语
捷克语
斯洛伐克语
斯洛文尼亚语
斯瓦希里语
旁遮普语
日语
格鲁吉亚语
毛利语
法语
波兰语
波斯尼亚语
波斯语
泰卢固语
泰米尔语
泰语
海地克里奥尔语
爱尔兰语
爱沙尼亚语
瑞典语
白俄罗斯语
立陶宛语
索马里语
约鲁巴语
缅甸语
罗马尼亚语
老挝语
芬兰语
苗语
英语
荷兰语
菲律宾语
葡萄牙语
蒙古语
西班牙语
豪萨语
越南语
阿塞拜疆语
阿尔巴尼亚语
阿拉伯语
韩语
马其顿语
马尔加什语
马拉地语
马拉雅拉姆语
马来语
马耳他语
高棉语
齐切瓦语
  世界语
中文简体
中文繁体
丹麦语
乌克兰语
乌兹别克语
乌尔都语
亚美尼亚语
伊博语
俄语
保加利亚语
僧伽罗语
克罗地亚语
冰岛语
加利西亚语
加泰罗尼亚语
匈牙利语
南非祖鲁语
卡纳达语
印地语
印尼巽他语
印尼爪哇语
印尼语
古吉拉特语
哈萨克语
土耳其语
塔吉克语
塞尔维亚语
塞索托语
威尔士语
孟加拉语
宿务语
尼泊尔语
巴斯克语
布尔语(南非荷兰语)
希伯来语
希腊语
德语
意大利语
意第绪语
拉丁语
拉脱维亚语
挪威语
捷克语
斯洛伐克语
斯洛文尼亚语
斯瓦希里语
旁遮普语
日语
格鲁吉亚语
毛利语
法语
波兰语
波斯尼亚语
波斯语
泰卢固语
泰米尔语
泰语
海地克里奥尔语
爱尔兰语
爱沙尼亚语
瑞典语
白俄罗斯语
立陶宛语
索马里语
约鲁巴语
缅甸语
罗马尼亚语
老挝语
芬兰语
苗语
英语
荷兰语
菲律宾语
葡萄牙语
蒙古语
西班牙语
豪萨语
越南语
阿塞拜疆语
阿尔巴尼亚语
阿拉伯语
韩语
马其顿语
马尔加什语
马拉地语
马拉雅拉姆语
马来语
马耳他语
高棉语
齐切瓦语
         
 
 
 
文本转语音功能仅限200个字符
 
  选项 : 历史 : 反馈 : Donate 关闭

最新文章

  1. js动态添加事件-事件委托
  2. IOS网络第五天 AFN-01发送get和post请求
  3. 一、oracle数据库成功安装步骤 (11gR2)
  4. IOS-Social.framework
  5. 突破GFW,使用node.js
  6. python网络编程之最简单的单工通信
  7. openmp在图像处理上面的运用
  8. CoreOS Linux available in China
  9. 整合UMDH结果的一个小工具
  10. 2016年11月ACM/ICPC亚洲区北京赛赛后总结
  11. PAT 1034. Head of a Gang (30)
  12. 限制窗口拉伸范围——WM_GETMINMAXINFO
  13. 机器学习实战之 第10章 K-Means(K-均值)聚类算法
  14. 重要经验五:block作为属性的注意事项
  15. SQL注入原理及绕过安全狗
  16. tolua++没法用
  17. 记事本 HTML
  18. action,func简洁用法
  19. union 和struct大小计算
  20. Git分支合并:Merge、Rebase的选择

热门文章

  1. Linux-day02
  2. SDOI 2019 R2 摸鱼记
  3. parameter与argument,property与attribute
  4. Salesforce 开发整理(五)代码开发最佳实践
  5. 调用 redis 原子命令,保证多线程安全 的incr命令问题
  6. CentOS7 CPU 降频问题
  7. Learn About Git Bash
  8. SpringBoot 应用篇之从 0 到 1 实现一个自定义 Bean 注册器
  9. [转帖]Centos7防火墙配置rich-rule实现IP端口限制访问
  10. [转帖]PostgreSQL 参数调整(性能优化)