此接口是针对Spring中的单例Bean设计的。提供了统一访问单例Bean的功能,BeanFactory可实现此接口以提供访问内部单例Bean的能力。

//将对象(singletonObject)注册为单例,名称为beanName
void registerSingleton(String beanName, Object singletonObject);
//获取名称为beanName的对象
Object getSingleton(String beanName);
//注册表中是否存在一个名称是beanName的单例
boolean containsSingleton(String beanName);
//获取注册表中所有的单例名称
String[] getSingletonNames();
//获取单例数量
int getSingletonCount();

DefaultSingletonBeanRegistry实现类

共享bean实例的通用注册表,实现了SingletonBeanRegistry. 允许注册表中注册的单例应该被所有调用者共享,通过bean名称获得。

还支持登记的DisposableBean实例,(这可能会或不能正确的注册单例),关闭注册表时destroyed. 可以注册bean之间的依赖关系,执行适当的关闭顺序。

这个类主要用作基类的BeanFactory实现, 提供基本的管理 singleton bean 实例功能。

注意:与AbstractBeanFactory跟DefaultListableBeanFactory不同,这个类既不是一个bean definition概念的标识,也不标识特定的创建过程。也可以作为嵌套的助手来委托。

  • 负责管理singlenton对象,
  • 负责管理ObjectFactory对象
  • 负责管理singleanton对象与ObjectFactory对象的 beanName
  • 负责管理signleton状态中需要执行销毁流程的对象
  • 负责需要管理@Dependent注解以及spring boot里面的功能相同的注解产生的依赖关系与被依赖关系
  • 负责控制并发情况下销毁beanfactory
  • 负责控制并发情况下只有一个线程注册同一个bean。

继承体系

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
 
 
 
 
 
 
 
 
 
 
 
 
继承体系

分析

DefaultSingletonBeanRegistry主要是通过内部的几个map对象(SingletonFactories,earlySingletonObjects,singletonObjects)来保存注册的Bean。

对应关系是:

SingletonFactories维护了这个beanName的ObjectFactory。ObjectFactory通过getObject方法获取到了earlySingletonBean,然后在由earlySingletonBean成为bean的实例。

各个SingletonObject之间的关系也是由几个map对象维护(containedBeanMap,dependentBeanMap,dependenciesForBeanMap)。

containedBeanMap(被包含关系:key被value所包含):key是被包含的bean, value则是包含该Bean的所有的bean。(在发现销毁时:value也要被销毁)

dependentBeanMap(被依赖关系:key被value锁依赖):key是被依赖的bean,value则是依赖于该bean的所有bean。(在发生销毁时:value要先于bean被销毁)

dependenciesForBeanMap(依赖关系:key依赖于value):key表示的bean依赖于value表示的Bean。

在注册两个bean包含关系的时候,同时要注册他们的依赖关系。

最新文章

  1. ZeroMQ接口函数之 :zmq_ctx_new – 创建一个新的ZMQ 环境上下文
  2. T卡热插拔
  3. NUC_HomeWork1 -- POJ1088(DP)
  4. ExtJs 可查询的下拉框
  5. 区间合并 --- Codeforces 558D : Gess Your Way Out ! II
  6. 重学STM32---(三) 中断分组和优先级
  7. ES 的CRUD 简单操作(小试牛刀)
  8. Intent系列讲解---Intent简介以及相关属性
  9. Android Studio中如何打JAR包
  10. OGEngine教程:声音载入
  11. Case learning
  12. 问题:DataGrid该行并不总是很清楚验证错误(删除), 解决方案,如下面
  13. 为UIView添加分类直接改或获取控件的frame值
  14. javascript之DOM编程实现城市的联动框
  15. js基础进阶--编的实用技巧(一)
  16. appium+python搭建自动化测试框架_Appium元素定位(二)
  17. 浅谈HTTP协议与TCP协议
  18. Linux系统平均负载3个数字的含义
  19. Windows平台下载Android源码(整理)
  20. 2018-01-11 Antlr4实现数学四则运算

热门文章

  1. Latex 数字加粗后变宽 Latex bold without increasing the length of the text
  2. 数据结构Java版之二叉查找树(七)
  3. service mesh,linkerd,sidecar,apigateway
  4. 如何监控tomcat性能:[1]工具一
  5. 前端 img标签显示 base64格式的 图片
  6. post请求头中常见content-type(非常重要)
  7. 使用Dapper.Contrib
  8. Oracle数据库启动报错,找不到数据文件(ORA-01157和ORA-01110)
  9. AdapterViewFlipper
  10. 关于golang中IO相关的Buffer类浅析