spring那些事 研究IOC容器5
BeanDefinitionRegistry的注册实现分析
(提出问题)
如果自己实现org.springframework.beans.factory.support.BeanDefinitionRegistry接口?()
(做出假设)
1判断beanDefinition的合法性
1.1 相对应的类是否存在
1.2 是否已经注册过
2必然的并发插入考虑
3如何快速定位对应名字的beandefinition
4依赖的bean如何加载
(实验并观察)
DefaultListableBeanFactory 是如何实现BeanDefinitionRegistry的registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
-
必然的防空校验
-
转换为可用的beanDefinition类型AbstractBeanDefinition
-
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);一个ConcurrentHashMap的注册集合,防止并发问题
-
查询是否已经注册过该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
-
如果曾经存在相应的beanDefinition则重置beanDefinition,并销毁原来的实例
(结论)
依赖的bean如何加载 这个问题spring 并未在注册beanDefinition中进行验证