首先我们访问ClassPathXmlApplicationContext
构造函数
里面有个refresh()
-> 父类AbstractApplicationContext
的refresh()
方法
这个时候开始进行定位步骤
-
refresh()
-> -
AbstractApplicationContext#obtainFreshBeanFactory()
-> -
AbstractApplicationContext#refreshBeanFactory()
-> -
接着调用 其他实现子类
AbstractRefreshableApplicationContext#refreshBeanFactory()
-> -
通过
AbstractRefreshableApplicationContext#loadBeanDefinitions()
-> -
调用真正解析的子类
XmlWebApplicationContext
的loadBeanDefinitions(DefaultListableBeanFactory)
->- 根据
beanFactory
创建一个XmlBeanDefinitionReader
对象,用来解析XML
- 根据
-
调用
XmlWebApplicationContext
的loadBeanDefinitions(XmlBeanDefinitionReader)
->- 循环传入的配置路径
- 通过之前创建的
XmlBeanDefinitionReader
来进行解析每一个配置文件
- 调用
AbstractBeanDefinitionReader
的loadBeanDefinitions(String)
函数 -> - 调用
AbstractBeanDefinitionReader
的loadBeanDefinitions(String, Resource>)
函数 ->- 获取
ResourceLoader
- 判断
ResourceLoader
是否是
ResourcePatternResolver`类型- 是的话 :调用
loadBeanDefinitions(Resource...)
函数 处理集合 - 否的话:调用
loadBeanDefinitions(Resource)
函数 处理单个
- 是的话 :调用
- 获取
- 这里看处理单个的 :调用
XmlBeanDefinitionReader
的loadBeanDefinitions(Resource)
的函数 -> - 调用当前类
XmlBeanDefinitionReader
的loadBeanDefinitions(EncodedResource)
函数-> - 真正开始加载文件 : 调用当前类
XmlBeanDefinitionReader
的doLoadBeanDefinitions
-> - 调用当前类
XmlBeanDefinitionReader
的doLoadBeanDefinitions(InputSource,Resource)
函数->- 根据传入的
Resource
和inputSource
获取到Document
对象
- 根据传入的
- 调用当前类
registerBeanDefinitions
的registerBeanDefinitions(Document,Resource)
函数 进行解析文件到BeanDefinition
->- 创建一个
BeanDefinitionDocumentReader
对象, 具体实现类是DefaultBeanDefinitionDocumentReader
- 创建一个
- 通过之前创建的
DefaultBeanDefinitionDocumentReader
对象,调用他的registerBeanDefinitions(Document,XmlReaderContext)
函数-> - 调用当前类
DefaultBeanDefinitionDocumentReader
的doRegisterBeanDefinitions(Element)
函数 -> - 调用当前类
DefaultBeanDefinitionDocumentReader
的parseBeanDefinitions(Element,BeanDefinitionParserDelegate)
->- 根据当前文件的namespace选择不同的解析方式
- 默认的话
http://www.springframework.org/schema/beans
调用parseDefaultElement(Element, BeanDefinitionParserDelegate)
函数 - 否则的话 调用
parseCustomElement(Element)
函数
- 默认的话
- 根据当前文件的namespace选择不同的解析方式
- 查看
parseDefaultElement(Element, BeanDefinitionParserDelegate)
函数 ->- 解析import
- 解析alias
- 解析bean
- 解析beans
- 接着调用
doRegisterBeanDefinitions(Element)
解析bean
- 接着调用
- 查看解析bean的
processBeanDefinition(Element , BeanDefinitionParserDelegate )
->- 设置一个
BeanDefinitionHolder
处理器 - 开始注册
- 设置一个
- 调用
BeanDefinitionReaderUtils
的registerBeanDefinition(BeanDefinitionHolder,BeanDefinitionRegistry)
函数- 获取bean的名称
- 开始注册
- bean的别名也注册起来
- 开始注册:
DefaultListableBeanFactory
的registerBeanDefinition(beanName,BeanDefinition)
函数- 注册到ioc中
beanDefinitionMap
中 - 注册到
manualSingletonNames
中 - 注册到
beanDefinitionNames
中
- 注册到ioc中
-
AbstractApplicationContext
- ApplicationContext的抽象类,包含了所有的方法
-
AbstractRefreshableApplicationContext
- 主要用来刷新上下文
-
XmlWebApplicationContext
- 主要用来处理xml的上下文
-
AbstractBeanDefinitionReader
- 解析beanDefinition的抽象类
-
BeanDefinitionDocumentReader
- 具体解析BeanDefinition的实现类 解析Document
-
BeanDefinitionReaderUtils
- 获取reader的别名
-
DefaultListableBeanFactory
- 具体注册的类,真正处理的类