在介绍本文主体BeanDefinitionRegistry之前,先看一下BeanDefinition,两者有紧密的联系。
BeanDefinition接口
1 | public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement { |
可以看到上面的很多属性和方法都很熟悉,基本上和用xml配置中的
BeanDefinition是一个接口,是一个抽象的定义,实际使用的是其实现类,如 ChildBeanDefinition、RootBeanDefinition、GenericBeanDefinition等。
- BeanDefinition继承了AttributeAccessor,说明它具有处理属性的能力;
- BeanDefinition继承了BeanMetadataElement,说明它可以持有Bean元数据元素,作用是可以持有XML文件的一个bean标签对应的Object。
BeanDefinition继承图
- AnnotatedBeanDefinition接口是BeanDefinition接口的子接口,包括了实例的注解信息
- ScannedGenericBeanDefinition类是AnnotatedBeanDefinition接口的实现类,ClassPathScanningCandidateComponentProvider扫描出来的类信息就会封装成ScannedGenericBeanDefinition,这是一个被扫描到的类定义
- AnnotatedGenericBeanDefinition类也是AnnotatedBeanDefinition接口的实现类,在AnnotatedBeanDefinitionReader读取器读取类后封装成的,这是一个被注解过的类定义
BeanDefinitionRegistry接口
见名知意,BeanDefinitionRegistry是BeanDefinition的一个注册中心,提供了注册、移除、获取等方法,其父接口定义了给BeanDefinition设置别名的一些方法。
1 | public interface BeanDefinitionRegistry extends AliasRegistry { |
- SimpleBeanDefinitionRegistry是一个简单的BeanDefinitionRegistry接口的实现类,内部使用Map<String, BeanDefinition>类型的map存储BeanDefinition信息
- DefaultListableBeanFactory这个BeanFactory接口的实现类也实现了BeanDefinitionRegistry接口,内部也是使用Map<String, BeanDefinition>类型的map存储BeanDefinition信息
- 其它的BeanFactory或ApplicationContext都通过间接的组合或继承来使用DefaultListableBeanFactory对该功能实现。
registerBeanDefinition()实现
DefaultListableBeanFactory的实现方法
成员变量:
1 | /** Map of bean definition objects, keyed by bean name. */ |
方法实现:
1 |
|