上一节讲到了spring中依托PropertiesBeanDefinitionReader/XmlBeanDefinitionReader/AnnotatedBeanDefinitionReader几个类解析资源文件/class类来加载BeanDefinition到BeanDefinitionRegistry。该过程一般称之为“注册”。那注册之后通过依赖查找/依赖注入获取bean实例对象,在从BeanDefinition到Bean创建实例之间发生了什么样的变化?
首先我们观察一下BeanDefinition接口
BeanDefinition接口的主要功能就是描述bean的元信息,简单的说是描述bean的各种属性:isAbstract/scope/parentName/beanClassName;这个地方有个比较特殊的属性parentName;
如果我们的子类 subObject 继承了 parentObject,subObject会继承parentObject的属性,并可以覆盖重写。比如:
superUser 配置属性parent 为 user。那么superUser会继承user的属性比如age/name/而且会添加自己的属性address。
那该步骤发生的阶段就是在getBean的时候,判断是否有parent,如果有parent就合并元信息-mergeBeanDefinition
简单的入口:AbstractBeanFactory
在调用中
getMergedLocalBeanDefinition(beanName)方法
一路跟踪方法,发现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的时候处理的。