上一节讲到了spring中依托PropertiesBeanDefinitionReader/XmlBeanDefinitionReader/AnnotatedBeanDefinitionReader几个类解析资源文件/class类来加载BeanDefinition到BeanDefinitionRegistry。该过程一般称之为“注册”。那注册之后通过依赖查找/依赖注入获取bean实例对象,在从BeanDefinition到Bean创建实例之间发生了什么样的变化?

首先我们观察一下BeanDefinition接口

《spring基本思想》7-BeanDefinition的合并-mergeBeanDefinition

BeanDefinition接口的主要功能就是描述bean的元信息,简单的说是描述bean的各种属性:isAbstract/scope/parentName/beanClassName;这个地方有个比较特殊的属性parentName;

如果我们的子类 subObject 继承了 parentObject,subObject会继承parentObject的属性,并可以覆盖重写。比如:《spring基本思想》7-BeanDefinition的合并-mergeBeanDefinition

superUser 配置属性parent 为 user。那么superUser会继承user的属性比如age/name/而且会添加自己的属性address。

那该步骤发生的阶段就是在getBean的时候,判断是否有parent,如果有parent就合并元信息-mergeBeanDefinition

简单的入口:AbstractBeanFactory

《spring基本思想》7-BeanDefinition的合并-mergeBeanDefinition

在调用中

《spring基本思想》7-BeanDefinition的合并-mergeBeanDefinition

getMergedLocalBeanDefinition(beanName)方法

《spring基本思想》7-BeanDefinition的合并-mergeBeanDefinition

《spring基本思想》7-BeanDefinition的合并-mergeBeanDefinition

一路跟踪方法,发现pdb=parentBeanDefinition,mbd=mergedBeanDefinition

mbd先copy一份pbd的信息,然后覆盖重写自己的信息

调用堆栈

AbstractBeanFactory:getBean(String name)

AbstratcBeanFactory:doGetBean(String name,Class<T> requiredType,final Object[]args,boolean typeCheckOnly)

AbstractBeanFactory:getMergedLocalBeanDefinition(String beanName)

AbstractBeanFactory:getMergedBeanDefinition(String beanName,BeanDefinition bd)

AbstractBeanFactory:getMergedBeanDefinition(String beanName,BeanDefinition bd,BeanDefintion containingBd)

那这个地方可以推断,BeanDefinitionReader只是单纯的读去配置文件,注册beanDefinition,BeanDefinition的属性变化,覆盖,依赖查找都是在getBean的时候处理的。

相关文章:

  • 2021-07-23
  • 2022-12-23
  • 2021-05-26
  • 2021-10-02
  • 2021-05-25
  • 2021-07-04
  • 2021-11-20
  • 2021-04-22
猜你喜欢
  • 2021-06-16
  • 2021-07-21
  • 2021-05-15
  • 2021-09-01
  • 2021-11-16
  • 2021-07-30
  • 2022-12-23
相关资源
相似解决方案