spring那些事 研究IOC容器5

本文详细探讨了Spring框架中BeanDefinitionRegistry的注册实现,包括beanDefinition的合法性检查、并发插入处理、快速查找机制以及依赖bean的加载策略。在注册过程中,通过ConcurrentHashMap确保线程安全,若bean已存在,则根据允许覆盖策略决定是否更新;若尚未创建实例,会根据情况更新beanDefinitionMap、beanDefinitionNames和manualSingletonNames。
摘要由CSDN通过智能技术生成

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)
  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中进行验证

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值