BeanDefinitionRegistry接口:
用于注册BeanDefinition到容器中的接口类
实现类众多
抽象类:AbstractBeanDefinition
SpringBoot默认使用的实现类是:DefaultListableBeanFactory
主要接口方法:
1.registerBeanDefinition(注册BeanDefinition)
2.removeBeanDefinition(反注册BeanDefinition)
3.getBeanDefinition(从已注册列表中获取BeanDefinition)
4.containsBeanDefinition(查看注册列表中是否包含当前BeanDefinition)
我们用到最多的是registerBeanDefinition方法,这里就DefaultListableBeanFactory来详细分析下:
执行步骤如下:
1.首先校验beanName和BeanDefinition是否为空
2.如果instanceof AbstractBeanDefinition,则调用父类validate
3.从注册表中根据beanName获取已经注册的BeanDefinition,与目标BeanDefinition对比,如果不能覆写,则返回BeanDefinitionStoreException
4.如果注册表中还没有该beanName对应的BeanDefinition,需要刷新beanDefinitionMap beanDefinitionNames manualSingletonNames三个属性中数据
5.最后,如果满足其中一个条件:1.注册表中已有该beanName 2.该单例已被创建,则重置BeanDefinition,里面用到了递归,主要为了处理BeanDefinition的父子关系问题