此接口是针对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包含关系的时候,同时要注册他们的依赖关系。

Spring之25:SingletonBeanRegistry&DefaultSingletonBeanRegistry的更多相关文章

  1. 【Spring】25、Spring代理。 BeanNameAutoProxyCreator 与 ProxyFactoryBean

    一般我们可以使用ProxyBeanFactory,并配置proxyInterfaces,target和interceptorNames实现,但如果需要代理的bean很多,无疑会对spring配置文件的 ...

  2. Spring Boot (25) RabbitMQ消息队列

    MQ全程(Message Queue)又名消息队列,是一种异步通讯的中间件.可以理解为邮局,发送者将消息投递到邮局,然后邮局帮我们发送给具体的接收者,具体发送过程和时间与我们无关,常见的MQ又kafk ...

  3. Spring系列25:Spring AOP 切点详解

    本文内容 Spring 10种切点表达式详解 切点的组合使用 公共切点的定义 声明切点@Poincut @Poincut 的使用格式如下: @Poincut("PCD") // 切 ...

  4. Spring IoC容器与应用上下文的设计与实现

    一.前言 写这篇博文的主要目的如下: 通过相关类和接口分析IoC容器到底长什么样. 阐述笔者对Spring上下文和容器的理解. 介绍重要的类辅助理解SpringBoot的启动流程. 二.Spring ...

  5. 从Spring中学到的【1】--读懂继承链

    最近看了一些 Spring 源码,发现源码分析的文章很多,而底层思想分析的文章比较少,这个系列文章准备总结一下Spring中给我的启示,包括设计模式思想.SOLID设计原则等,涉及一些编程的基本原则, ...

  6. Mybatis与Spring整合,使用了maven管理项目,作为初学者觉得不错,转载下来

    转载自:http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype ...

  7. 关于Spring Security 3获取用户信息的问题

    标签: spring security 3标签获取用户信息 2013-01-05 10:40 5342人阅读 评论(0) 收藏 举报  分类: Spring(25) java(70) 前端(7)    ...

  8. Mybatis3.x与Spring4.x整合(转)

    http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:cre ...

  9. MyBatis入门学习教程-Mybatis3.x与Spring4.x整合

    一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-myba ...

随机推荐

  1. [WEB安全]PHP伪协议总结

    0x01 简介 首先来看一下有哪些文件包含函数: include.require.include_once.require_once.highlight_file show_source .readf ...

  2. jquery中语法初学必备

    $(this).hide() - 隐藏当前元素 $("p").hide() - 隐藏所有段落 $(".test").hide() - 隐藏所有 class=&q ...

  3. Samba文件共享服务设置

    SMB的主程序 smbd:SMB-TCP139,CIFS-TCP445 nmbd:NetBios-UDP137,138 SMB主程序对应的两个服务 /etc/init.d/smb /etc/init. ...

  4. python常用规范

    Python代码规范和命名规范 前言 Python 学习之旅,先来看看 Python 的代码规范,让自己先有个意识,而且在往后的学习中慢慢养成习惯 目录 一.简明概述 1.编码 如无特殊情况, 文件一 ...

  5. 天池移动推荐算法赛--https://github.com/PnYuan/Tianchi-BigData

    参考: https://blog.csdn.net/Snoopy_Yuan/article/details/75808006

  6. 微信小程序设置全局请求URL 封装wx.request请求

    app.js: App({ //设置全局请求URL globalData:{ URL: 'https://www.oyhdo.com', }, /** * 封装wx.request请求 * metho ...

  7. include mime.types;

    include mime.types; (index):1 Resource interpreted as Stylesheet but transferred with MIME type appl ...

  8. disruptor 单生产者多消费者

    demo1 单生产者多消费者创建. maven 依赖 <!-- https://mvnrepository.com/artifact/com.lmax/disruptor --> < ...

  9. kotlin中val和var的区别

    var: var是一个可变变量,这是一个可以通过重新分配来更改为另一个值的变量.这种声明变量的方式和Java中声明变量的方式一样.val: val是一个只读变量,这种声明变量的方式相当于java中的f ...

  10. 反射load,loadfile,LoadFrom区别

    反射加载数据用法 Load Assembly assembly = Assembly.Load("Ruanmou.DB.MySql");//dll名称无后缀 从当前目录加载dll ...