zoukankan      html  css  js  c++  java
  • Spring之25:SingletonBeanRegistry&DefaultSingletonBeanRegistry

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

  • 相关阅读:
    酷狗大数据平台架构是如何重构的
    分层架构,前后端分离有啥坏处?
    Redis快速入门及应用
    Kafka不只是个消息系统
    提高代码质量:如何编写函数
    jquery 回车事件
    程序员的薪资是如何确定出来的?
    HTTP 错误 500.21
    制作手机浏览器显示格式的HTML页面
    操作必须使用一个可更新的查询。
  • 原文地址:https://www.cnblogs.com/duanxz/p/3628774.html
Copyright © 2011-2022 走看看