《spring设计思想》7-BeanDefinition的合并-mergeBeanDefinition

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

首先我们观察一下BeanDefinition接口

《spring设计思想》7-BeanDefinition的合并-mergeBeanDefinition_第1张图片

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

如果我们的子类 subObject 继承了 parentObject,subObject会继承parentObject的属性,并可以覆盖重写。比如:《spring设计思想》7-BeanDefinition的合并-mergeBeanDefinition_第2张图片

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

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

简单的入口:AbstractBeanFactory

在调用中

《spring设计思想》7-BeanDefinition的合并-mergeBeanDefinition_第3张图片

getMergedLocalBeanDefinition(beanName)方法

《spring设计思想》7-BeanDefinition的合并-mergeBeanDefinition_第4张图片

《spring设计思想》7-BeanDefinition的合并-mergeBeanDefinition_第5张图片

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

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

调用堆栈

AbstractBeanFactory:getBean(String name)

AbstratcBeanFactory:doGetBean(String name,Class 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的时候处理的。

你可能感兴趣的:(spring)