我们在xml中配置的bean标签、我们平时用的Component等注解标注的类,在容器中都会转化成BeanDefinition缓存在BeanDefinitionRegistry中。
在上一章Spring源码-类扫描器-ClassPathBeanDefinitionScanner中介绍了通过scan(basePackages)来从指定basePakcages下的class文件到ScannedGenericBeanDefinition的过程,我们本章就以ScannedGenericBeanDefinition来描述BeanDefinition。
类图:
ScannedGenericBeanDefinition继承自GenericBeanDefinition,GenericBeanDefinition继承自AbstractBeanDefinition,AbstractBeanDefinition实现了BeanDefinition接口。
同时实现了AnnotatedBeanDefinition接口用于访问注解的信息。
BeanDefinition
方法
1 | String: getBeanClassName: 返回当前bean definition定义的类名 |
AnnotatedBeanDefinition
功能
继承了BeanDefinition接口,并添加了对注解元数据访问的方法
方法
1 | AnnotationMetadata getMetadata(): 获得当前bean definition 的bean 类(class)的注解元数据 |
AbstractBeanDefinition、GenericBeanDefinition
功能
BeanDefinition的实现抽象类,GenericBeanDefinition继承自AbstractBeanDefinition
RootBeanDefinition
功能
spring的BeanDefinition有可能会包含parentName属性对应parentBeanDefinition,RootBeanDefinition会和parent的BeanDefinition进行Merge,容器根据RootBeanDefinition实例化对象。
应用
- 在refresh方法的preInstantiateSingletons()中,将所有的non-lazy-init的单例的BeanDefinition实例化,
getType、getBean
关键代码:getMergedBeanDefinition 将parentBeanDefinition和childBeanDefinition合并。
1 | protected RootBeanDefinition getMergedBeanDefinition( |