【Spring源码】4.IOC之解析xml配置文件 & 构建BeanDefinition

  • obtainFreshBeanFactory()大体流程
  • 1.创建BeanFactory对象
    • 1.点进obtainFreshBeanFactory()方法
    • 2.点进refreshBeanFactory(),查看AbstractRefreshableApplicationContext的具体实现
      • createBeanFactory()
      • customizeBeanFactory(beanFactory);
  • 2. 解析xml : loadBeanDefinitions(beanFactory)
    • 2.1 将xml文件 解析成 Element对象
    • 2.2 默认标签的处理
      • 2.2.1. Bean标签的解析
        • 2.2.1.1 BeanDefinition的创建
          • 1. beanName的判断
          • 2.parseBeanDefinitionElement 创建BeanDefinition对象
            • parseBeanDefinitionAttributes
    • 2.3 自定义标签
      • 2.3.1 获取对应标签头的处理器 :典型的spi 模式的运用。
        • 1. 获取所有的handlers
        • 2. 获取标签头对应的handler
        • 3. 调用handler.init()方法,注册解析器
        • 4. 获取对应的解析器, 调用parse进行解析
        • 5.ComponentScanBeanDefinitionParser.parse : 扫包创建BD
          • 1.ClassPathBeanDefinitionScanner.doScan() 扫包
          • 2. 判断是否该类是否需要注册
          • 3. 注册几个BeanPostProcessor类

直接走进核心方法refresh() ,看第一个重要的方法obtainFreshBeanFactory()

image

obtainFreshBeanFactory()大体流程

 1、创建BeanFactory对象,并返回出来
 2、xml解析
    传统标签解析:bean、import等
    自定义标签解析 如:
    自定义标签解析流程:
        a、根据当前解析标签的头信息找到对应的namespaceUri
        b、加载spring所以jar中的spring.handlers文件。并建立映射关系
        c、根据namespaceUri从映射关系中找到对应的实现了NamespaceHandler接口的类
        d、调用类的init方法,init方法是注册了各种自定义标签的解析类
        e、根据namespaceUri找到对应的解析类,然后调用paser方法完成标签解析
3、把解析出来的xml标签封装成BeanDefinition对象

1.创建BeanFactory对象

1.点进obtainFreshBeanFactory()方法

我们主要看refreshBeanFactory()方法

image

2.点进refreshBeanFactory(),查看AbstractRefreshableApplicationContext的具体实现

image

createBeanFactory()

new 了一个DefaultListableBeanFactory 对象,并返回了出来。

image

最后 refreshBeanFactory() 最终返回的BeanFactory 对象也是new 出来的。

customizeBeanFactory(beanFactory);

这个方法设置了BeanFactory的两个属性,默认值是true。

image
  1. allowBeanDefinitionOverriding :设置 是否允许BeanDefinition的重写, 这种判断 作用在 xml里面 配置的Bean的id相同的情况下,后面一个会重写前面那个。
  2. allowCircularReferences :设置是否允许循环依赖。循环依赖 一般指的是 当a实例化时,依赖b, b实例化时又依赖a。常见的有 a,b相互配置了dependOn属性,a,b 互相 属性依赖,还有一种 a,b 构造器参数的相互依赖,这种是无法解决的,spring实例化时会直接抛异常的。

refreshBeanFactory() 该方法剩下的逻辑 是解析xml文件,封装beanDefinition,并注册进BeanFactory中。

2. 解析xml : loadBeanDefinitions(beanFactory)

2.1 将xml文件 解析成 Element对象

image

获取xml文件的路径, 然后委托给解析器 解析

image

遍历解析 配置文件的数组

image

将xml文件 转化成Resource 对象,

image
image

把resource包成 带编码的

image

获取resource对象的流,包装成 jdk中 sax xml文件的解析对象 InputSource

image

把inputSource 封装成Document文件对象,继续走下去

image

委托给新创建的BeanDefinitionDocumentReader对象 来解析 document

image

解析玩Document之后,就可以 拿到xml文件的root对象,和里面的节点,

image
image

到这里,xml文件已经解析成 Element对象了, 接下来就是 解析root节点里的子标签了, 比如常见 配置文件里的标签




                    

你可能感兴趣的:(【Spring源码】4.IOC之解析xml配置文件 & 构建BeanDefinition)