美文网首页
DefaultSingletonBeanRegistry

DefaultSingletonBeanRegistry

作者: WILL_HUNTING | 来源:发表于2018-09-30 18:01 被阅读0次

    总览

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

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

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

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

    继承体系

    SimpleAliasRegistry

    实现了注册别名接口

    SingletonBeanRegistry

    单例bean注册接口
    方法列表

    序号 方法名称 描述
    1 void registerSingleton(String beanName, Object singletonObject); 注册一个单例
    2 Object getSingleton(String beanName); 给定名称返回一个单例
    3 boolean containsSingleton(String beanName); 是否包含给定名字的单例
    4 String[] getSingletonNames(); 返回所有单例名
    5 int getSingletonCount(); 返回单例次数
    6 Object getSingletonMutex(); ???
    继承体系

    分析

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

    问题

    protected void addSingleton(String beanName, Object singletonObject) {
            synchronized (this.singletonObjects) {
                this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));
                // 已经存在该单例bean的实例,因此对应的工厂和earlySingleton不在需要了
                this.singletonFactories.remove(beanName);
                // TODO 这个还不知道是干嘛的
                this.earlySingletonObjects.remove(beanName);
                // 添加进注册表
                this.registeredSingletons.add(beanName);
            }
        }
    
    1. 这些方法为什么不用ConcurrentHashMap
    2. earlySingletonObjects这个是干什么的?
    3. 如何解析循环引用
    /**
         * Add the given singleton factory for building the specified singleton
         * if necessary.
         * <p>To be called for eager registration of singletons, e.g. to be able to
         * resolve circular references.
         *
         * 被要求立即注册单例,例如能够解析循环引用
         *
         * TODO 如何解析循环引用
         *
         * @param beanName the name of the bean
         * @param singletonFactory the factory for the singleton object
         */
        protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
            Assert.notNull(singletonFactory, "Singleton factory must not be null");
            synchronized (this.singletonObjects) {
                if (!this.singletonObjects.containsKey(beanName)) {
                    this.singletonFactories.put(beanName, singletonFactory);
                    this.earlySingletonObjects.remove(beanName);
                    this.registeredSingletons.add(beanName);
                }
            }
        }
    

    相关文章

      网友评论

          本文标题:DefaultSingletonBeanRegistry

          本文链接:https://www.haomeiwen.com/subject/hbiwoftx.html