一、概念说明
1. Context(上下文)什么意思?
一个简单的情景,迟到的你,进入教室,老师说,这个问题因该怎么解?你肯定会想“这个问题是什么问题”,而未迟到的同学就不会有这样的疑问,因为他们有关于上一时间点发生事情的信息(老师说的话),这就是上下文。在你的大脑中会保存上一时间地点的信息或者是大脑对其处理的信息。
而在我们程序中,同样需要一种词汇去形容这样一种情形(下一时间点的任务处理需要上一时间点信息的配合),
2.Spring MVC中那些场景以Context命名?
ApplicationContext(应用程序上下文)
这个上下文包含了框架运行的重要信息,以K-V形式存在于servletContext中,我们可以在合适地方拿到这个上下文,做一些逻辑处理
ReaderContext(读取器上下文)
这个上下文包含了xml到dom对象过程中的一些信息,用于对各个元素的处理(如:bean元素的解析对象BeanDefinitionParserDelegate,他持有一个上下文,你也可以理解为一个处理过程转交到另一个处理过程中,要传递的参数太多,所以需要封装一个上下文),
二、各个类如何协同完成IOC容器的初始化
IOC容器的初始化非常复杂,正因为其复杂,才可以适应多种变化。站在容器的设计者的角度,我们应该考虑以下几方面的内容:
1.对未来可能新增标签的处理(一个命名空间对应一个标签解析器【开闭原则】)
2.xml文件中所配置路径的处理(包括:占位符,classpath的转义【spring特有】)
3.对内置标签的处理
4.标签的属性处理
5.标签的子元素的处理
6.标签的子元素属性的处理
上面所列出的最容易发生变化的就是第一个,也就是对未来可能扩展标签的处理。
那么Spring(IOC初始化过程)是如何设计类与类之间的关系呢?
前言:
在spring-web项目中,默认的父容器和子容器都是XmlWebApplicationContext。下面我们主要针对XmlWebApplicationContext进行分析。
1.XmlWebApplicationContext什么时候创建?
在web项目中,spring父容器的初始化(即new XmlWebApplicationContext)在ContextLoaderListener中完成,
子容器初始化在DispatcherServlet中完成,
2.XmlWebApplicationContext的初始化?
上下文的初始化由创建者完成(即设置各种成员变量),其中包括设置父上下文和beanDefinition文件的位置。至此,所有的信息都存入了context中,足够去加载bean定义文件了
3.XmlWebApplicationContext的核心refresh()
1.准备刷新(以后分析)
2.获取bean工厂(包括创建了bean工厂 和 将xml文件中的标签解析为beanDefinition对象)
3.准备bean工厂(以后分析)
4.bean工厂的后置处理
5.执行bean工厂的后置处理
6.初始化信息源
现在我们分析:
在获取bean工厂时,xml文件-------->dom对象-------->beanDefinition各个类的协同关系
1.涉及到的类:
XmlBeanDefinitionReader(持有beanFactory的引用,将解析后的beanDefinition存入beanFactory)
ResourceLoader(把路径封装为Resource)
ServletContextResourcePatternResolver(路径的模式解析)
DefaultDocumentLoader(输入流解析为dom对象)
DefaultBeanDefinitionDocumentReader(dom对象解析为beanDefinition)
XmlReaderContext(存放一些DefaultBeanDefinitionDocumentReader可能用到的信息)
BeanDefinitionParserDelegate(bean标签的解析处理)
2.图解如下: