spring那些事 研究IOC容器5

BeanDefinitionRegistry的注册实现分析
spring那些事 研究IOC容器5

(提出问题)

如果自己实现org.springframework.beans.factory.support.BeanDefinitionRegistry接口?()

(做出假设)

1判断beanDefinition的合法性
1.1 相对应的类是否存在
1.2 是否已经注册过
2必然的并发插入考虑
3如何快速定位对应名字的beandefinition
4依赖的bean如何加载

(实验并观察)

DefaultListableBeanFactory 是如何实现BeanDefinitionRegistry的registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
  1. 必然的防空校验

  2. 转换为可用的beanDefinition类型AbstractBeanDefinition

  3. private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);一个ConcurrentHashMap的注册集合,防止并发问题

  4. 查询是否已经注册过该beanName对应的BeanDefinition

    4.1 如果存在对应的BeanDefinition,只有旧的BeanDefinition允许被覆盖才能成功覆盖。

    4.2 该beanName对应的BeanDefinition未被注册, 查询是否创建果bean实例

    ​ 4.2.1 如果实例已经被注册过,那么重造manualSingletonNames,beanDefinitionNames,并且注册相关beanDefinition。这里为何重造我考虑原因是模仿copyonwrite的思想-----读写分离

    ​ 4.2.2 如果beanFactory未创建过bean实例向beanDefinitionMap添加beanDefinition, 并添加实例名到beanDefinitionNames 和manualSingletonNames

  5. 如果曾经存在相应的beanDefinition则重置beanDefinition,并销毁原来的实例

(结论)

依赖的bean如何加载 这个问题spring 并未在注册beanDefinition中进行验证