Skip to content

Latest commit

 

History

History
106 lines (72 loc) · 4.12 KB

Spring IOC.md

File metadata and controls

106 lines (72 loc) · 4.12 KB

Spring ioc

时序图

结构解析

首先我们访问ClassPathXmlApplicationContext构造函数

里面有个refresh() -> 父类AbstractApplicationContextrefresh()方法

定位

这个时候开始进行定位步骤

  • refresh()->

  • AbstractApplicationContext#obtainFreshBeanFactory() ->

  • AbstractApplicationContext#refreshBeanFactory() ->

  • 接着调用 其他实现子类AbstractRefreshableApplicationContext#refreshBeanFactory() ->

  • 通过AbstractRefreshableApplicationContext#loadBeanDefinitions() ->

  • 调用真正解析的子类XmlWebApplicationContextloadBeanDefinitions(DefaultListableBeanFactory) ->

    • 根据beanFactory 创建一个XmlBeanDefinitionReader 对象,用来解析XML
  • 调用XmlWebApplicationContextloadBeanDefinitions(XmlBeanDefinitionReader) ->

    • 循环传入的配置路径
    • 通过之前创建的XmlBeanDefinitionReader来进行解析每一个配置文件

加载

  • 调用AbstractBeanDefinitionReaderloadBeanDefinitions(String) 函数 ->
  • 调用AbstractBeanDefinitionReaderloadBeanDefinitions(String, Resource>)函数 ->
    • 获取 ResourceLoader
    • 判断ResourceLoader 是否是ResourcePatternResolver`类型
      • 是的话 :调用loadBeanDefinitions(Resource...)函数 处理集合
      • 否的话:调用loadBeanDefinitions(Resource)函数 处理单个
  • 这里看处理单个的 :调用XmlBeanDefinitionReaderloadBeanDefinitions(Resource)的函数 ->
  • 调用当前类XmlBeanDefinitionReaderloadBeanDefinitions(EncodedResource) 函数->
  • 真正开始加载文件 : 调用当前类XmlBeanDefinitionReaderdoLoadBeanDefinitions ->
  • 调用当前类XmlBeanDefinitionReaderdoLoadBeanDefinitions(InputSource,Resource) 函数->
    • 根据传入的ResourceinputSource 获取到Document对象
  • 调用当前类registerBeanDefinitionsregisterBeanDefinitions(Document,Resource) 函数 进行解析文件到BeanDefinition ->
    • 创建一个BeanDefinitionDocumentReader 对象, 具体实现类是DefaultBeanDefinitionDocumentReader
  • 通过之前创建的DefaultBeanDefinitionDocumentReader对象,调用他的registerBeanDefinitions(Document,XmlReaderContext) 函数->
  • 调用当前类DefaultBeanDefinitionDocumentReaderdoRegisterBeanDefinitions(Element) 函数 ->
  • 调用当前类DefaultBeanDefinitionDocumentReaderparseBeanDefinitions(Element,BeanDefinitionParserDelegate) ->
    • 根据当前文件的namespace选择不同的解析方式
      • 默认的话http://www.springframework.org/schema/beans 调用parseDefaultElement(Element, BeanDefinitionParserDelegate) 函数
      • 否则的话 调用parseCustomElement(Element) 函数
  • 查看parseDefaultElement(Element, BeanDefinitionParserDelegate) 函数 ->
    • 解析import
    • 解析alias
    • 解析bean
    • 解析beans
      • 接着调用doRegisterBeanDefinitions(Element) 解析bean
  • 查看解析bean的 processBeanDefinition(Element , BeanDefinitionParserDelegate ) ->
    • 设置一个BeanDefinitionHolder 处理器
    • 开始注册

注册

  • 调用BeanDefinitionReaderUtilsregisterBeanDefinition(BeanDefinitionHolder,BeanDefinitionRegistry) 函数
    • 获取bean的名称
    • 开始注册
    • bean的别名也注册起来
  • 开始注册:DefaultListableBeanFactoryregisterBeanDefinition(beanName,BeanDefinition)函数
    • 注册到ioc中 beanDefinitionMap
    • 注册到manualSingletonNames
    • 注册到beanDefinitionNames

具体类的作用

  • AbstractApplicationContext

    • ApplicationContext的抽象类,包含了所有的方法
  • AbstractRefreshableApplicationContext

    • 主要用来刷新上下文
  • XmlWebApplicationContext

    • 主要用来处理xml的上下文
  • AbstractBeanDefinitionReader

    • 解析beanDefinition的抽象类
  • BeanDefinitionDocumentReader

    • 具体解析BeanDefinition的实现类 解析Document
  • BeanDefinitionReaderUtils

    • 获取reader的别名
  • DefaultListableBeanFactory

    • 具体注册的类,真正处理的类

注解ioc 的时序图

注解ioc的实现