首页 > 其他 > 详细

DefaultSingletonBeanRegistry源码详解

时间:2016-04-11 12:19:48      阅读:282      评论:0      收藏:0      [点我收藏+]

    <img src="<span><a href=" http:="" img.blog.csdn.net="" 20160411104607715"="" target="_blank" class="texttolink">http://img.blog.csdn.net/20160411104607715" _xhe_src="http://img.blog.csdn.net/20160411104607715"/><img src="<span><a href=" http:="" img.blog.csdn.net="" 20160411104625162"="" target="_blank" class="texttolink">http://img.blog.csdn.net/20160411104625162" _xhe_src="http://img.blog.csdn.net/20160411104625162"/>


    这是DefaultSingletonBeanRegistry类的体系结构,由一个类一个责任的原则

    • AliasRegistry : 提供别名注册的接口
    • SingletonBeanRegistry :  提供单例bean注册的接口
    • ObjectFactory : 这个接口通常用于封装一个通用的工厂,它只有一个方法getObject() ,它调用getObject()方法返回一个新的实例,一些在每次调用的目标对象(原型).
    • DisposableBean : 接口实现为beans要破坏释放资源。它也只有一个方法destroy(),由一个破坏一个singleton的BeanFactory调用。
    • SimpleAliasRegistry: 它简单地实现了AliasRegistry接口。
    • DefaultSingletonBeanRegistry:它继承SimpleAliasRegistry类和实现了SingletonBeanRegistry接口,因此这个类可以有别名注册的功能和单例bean注册的功能,并且他还支持注册DisposableBean实例;它依赖ObjectFactory接口和DisposableBean接口(关闭注册表时调用到了destroy方法)。


     以下代码转载自:http://wugaokai.iteye.com/blog/1159796



import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.*;
import org.springframework.beans.factory.config.SingletonBeanRegistry;
import org.springframework.core.SimpleAliasRegistry;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 共享bean实例的通用注册表,实现了SingletonBeanRegistry. 允许注册表中注册的单例应该被所有调用者共享,通过bean名称获得。
 *
 * 还支持登记的DisposableBean实例,(这可能会或不能正确的注册单例),关闭注册表时destroyed.
 * 可以注册bean之间的依赖关系,执行适当的关闭顺序。
 *
 *
 * 这个类主要用作基类的BeanFactory实现, 提供基本的管理
 * singleton bean 实例功能。
 *
 */
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements
    SingletonBeanRegistry {

    //内部标记为一个空的单例对象: 并发 Maps( 不支持空值 )作为标志值。
    protected static final Object NULL_OBJECT = new Object();

    // 日志用来记录子类
    protected final Log logger = LogFactory.getLog(getClass());

    //是存放singleton对象的缓存
    private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>();

    // 是存放制造singleton的工厂对象的缓存
    private final Map<String, ObjectFactory> singletonFactories = new HashMap<String, ObjectFactory>();

    //是存放singletonFactory 制造出来的 singleton 的缓存
    private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>();
    //以上三个缓存是这个类存放单例bean的主要Map

    //就是单例注册表</span><span>
    private final Set<String> registeredSingletons = new LinkedHashSet<String>(16);

    //目前正在创建中的单例bean的名称的集合</span><span>
    private final Set<String> singletonsCurrentlyInCreation = Collections.synchronizedSet(new HashSet<String>());

    //存放异常出现的相关的原因的集合</span><span>
    private Set<Exception> suppressedExceptions;

    //标志,指示我们目前是否在销毁单例中</span><span>
    private boolean singletonsCurrentlyInDestruction = false;

    //存放一次性bean的缓存</span><span>
    private final Map<String, Object> disposableBeans = new LinkedHashMap<String, Object>();

    //外部bean与被包含在外部bean的所有内部bean集合包含关系的缓存
    private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<String, Set<String>>();

    //指定bean与依赖指定bean的所有bean的依赖关系的缓存
    private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<String, Set<String>>();

    //指定bean与创建这个bean所需要依赖的所有bean的依赖关系的缓存
    private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<String, Set<String>>();

    // SingletonBeanRegistry接口的registerSingleton方法的实现
    public void registerSingleton(String beanName, Object singletonObject)
        throws IllegalStateException {
        Assert.notNull(beanName, "'beanName' must not be null");
        synchronized (this.singletonObjects) {
            Object oldObject = this.singletonObjects.get(beanName);
            //如果singletonObjects缓存找到有指定名称为beanName的对象,则表示该名称已被占用
            if (oldObject != null) {
                throw new IllegalStateException("Could not register object ["
                    + singletonObject + "] under bean name '" + beanName
                    + "': there is already object [" + oldObject
                    + "] bound");
            }
            //若该名称没被占用,真正的注册操作在这里实现
                addSingleton(beanName, singletonObject);
        }
    }


    protected void addSingleton(String beanName, Object singletonObject) {
        synchronized (this.singletonObjects) {
            // 因为singletonObjects类型是ConcurrentHashMap,并发Map不支持空值作为标志值,所以用NULL_OBJECT来代替
            this.singletonObjects.put(beanName,
                (singletonObject != null ? singletonObject : NULL_OBJECT));
            // beanName已被注册存放在singletonObjects缓存,那么singletonFactories不应该再持有名称为beanName的工厂
            this.singletonFactories.remove(beanName);
            // beanName已被注册存放在singletonObjects缓存,那么earlySingletonObjects不应该再持有名称为beanName的bean。
            this.earlySingletonObjects.remove(beanName);
            // beanName放进单例注册表中
            this.registeredSingletons.add(beanName);
        }
    }

    /**
     * 添加 名称为beanName的singletonFactory对象
     *
     */
    protected void addSingletonFactory(String beanName,
        ObjectFactory singletonFactory) {
        Assert.notNull(singletonFactory, "Singleton factory must not be null");
        synchronized (this.singletonObjects) {
            // 判断singletonObjects内名字为beanName是否被占用,若没有,进行注册操作
            if (!this.singletonObjects.containsKey(beanName)) {
                this.singletonFactories.put(beanName, singletonFactory);
                this.earlySingletonObjects.remove(beanName);
                this.registeredSingletons.add(beanName);
            }
        }
    }

    // SingletonBeanRegistry接口的getSingleton方法的实现
    public Object getSingleton(String beanName) {
        return getSingleton(beanName, true);
    }


    protected Object getSingleton(String beanName, boolean allowEarlyReference) {
        Object singletonObject = this.singletonObjects.get(beanName);
        // 如果singletonObjects指定beanName的对象是不存在的
        if (singletonObject == null) {
            synchronized (this.singletonObjects) {
                singletonObject = this.earlySingletonObjects.get(beanName);
                // 如果earlySingletonObjects指定的beanName的对象是不存在的且allowEarlyReference是允许的
                if (singletonObject == null && allowEarlyReference) {
                    ObjectFactory singletonFactory = this.singletonFactories
                        .get(beanName);
                    // 如果存在指定beanName的singletonFactory对象
                    if (singletonFactory != null) {
                        // singletonFactory创建指定的单例对象
                        singletonObject = singletonFactory.getObject();
                        // 这里可以看出earlySingletonObjects缓存应该是存放singletonFactory产生的singleton
                        this.earlySingletonObjects.put(beanName,
                            singletonObject);
                        // 这里表示指定的beanName已被占用,所以要在singletonFactories移除该名称
                        this.singletonFactories.remove(beanName);
                    }
                }
            }
        }
        return (singletonObject != NULL_OBJECT ? singletonObject : null);
    }


    public Object getSingleton(String beanName, ObjectFactory singletonFactory) {
        Assert.notNull(beanName, "'beanName' must not be null");
        synchronized (this.singletonObjects) {
            Object singletonObject = this.singletonObjects.get(beanName);
            // 如果singetonObjects缓存不存在名称为beanName的对象
            if (singletonObject == null) {
                // 如果目前在销毁singleton
                if (this.singletonsCurrentlyInDestruction) {
                    throw new BeanCreationNotAllowedException(
                        beanName,
                        "Singleton bean creation not allowed while the singletons of this factory are in destruction "
                            + "(Do not request a bean from a BeanFactory in a destroy method implementation!)");
                }
                if (logger.isDebugEnabled()) {
                    logger.debug("Creating shared instance of singleton bean '"
                        + beanName + "'");
                }
                // 单例对象创建前的回调,默认实现注册正在创建的单例
                beforeSingletonCreation(beanName);
                // 判断存储异常相关原因的集合是否已存在
                boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
                // 若没有,刚创建异常集合的实例
                if (recordSuppressedExceptions) {
                    this.suppressedExceptions = new LinkedHashSet<Exception>();
                }
                try {
                    // 由参数给定的singletonFactory创建singleton对象,getObject方法的具体实现由ObjectFactory的子类决定
                    singletonObject = singletonFactory.getObject();
                } catch (BeanCreationException ex) {
                    // 如果异常被抓取,在这里将出现异常的原因抛出
                    if (recordSuppressedExceptions) {
                        for (Exception suppressedException : this.suppressedExceptions) {
                            ex.addRelatedCause(suppressedException);
                        }
                    }
                    throw ex;
                } finally {
                    // 结束前,将异常集合销毁掉
                    if (recordSuppressedExceptions) {
                        this.suppressedExceptions = null;
                    }
                    // 单例创建之后的回调,默认的实现标志单例不要在创建了。
                    afterSingletonCreation(beanName);
                }
                // 注册创建后的单例
                addSingleton(beanName, singletonObject);
            }
            return (singletonObject != NULL_OBJECT ? singletonObject : null);
        }
    }

    /**
     * 注册 发生在singeton bean 实例创建之间发生的异常
     */
    protected void onSuppressedException(Exception ex) {
        synchronized (this.singletonObjects) {
            if (this.suppressedExceptions != null) {
                this.suppressedExceptions.add(ex);
            }
        }
    }

    /**
     * 移除名称为beanName的单例,主要在四个集合中移除,
     * 如singletonObjects,singletonFactories,earlySingletonObjects
     * ,registeredSingletons
     *
     */
    protected void removeSingleton(String beanName) {
        synchronized (this.singletonObjects) {
            this.singletonObjects.remove(beanName);
            this.singletonFactories.remove(beanName);
            this.earlySingletonObjects.remove(beanName);
            this.registeredSingletons.remove(beanName);
        }
    }

    // singletonBeanRegistry接口的containsSingleton方法实现
    public boolean containsSingleton(String beanName) {
        return (this.singletonObjects.containsKey(beanName));
    }

    // singletonBeanRegistry接口的getSingletonNames方法实现
    public String[] getSingletonNames() {
        // 对singletonObjects加锁,可能是为了防止registeredSingletons和singletonObjects出现不一致的问题
        synchronized (this.singletonObjects) {
            return StringUtils.toStringArray(this.registeredSingletons);
        }
    }

    // singletonBeanRegistry接口的getSingletonCount方法实现
    public int getSingletonCount() {
        synchronized (this.singletonObjects) {
            return this.registeredSingletons.size();
        }
    }

    /**
     * 单例对象创建前的回调,默认实现singletonsCurrentlyInCreation集合注册正在创建的单例.
     *
     */
    protected void beforeSingletonCreation(String beanName) {
        if (!this.singletonsCurrentlyInCreation.add(beanName)) {
            throw new BeanCurrentlyInCreationException(beanName);
        }
    }

    /**
     * 单例创建之后的回调,默认实现singletonCurrentlyInCreation集合移除正在创建的单例</span><span>
     *
     */
    protected void afterSingletonCreation(String beanName) {
        if (!this.singletonsCurrentlyInCreation.remove(beanName)) {
            throw new IllegalStateException("Singleton '" + beanName
                + "' isn't currently in creation");
        }
    }

    /**
     * 返回 存放正在创建单例的集合是否包含指定名称为beanName的单例存在
     *
     */
    public final boolean isSingletonCurrentlyInCreation(String beanName) {
        return this.singletonsCurrentlyInCreation.contains(beanName);
    }

    /**
     * 一次性bean注册,存放在disponsableBeans集合中
     *
     */
    public void registerDisposableBean(String beanName, DisposableBean bean) {
        synchronized (this.disposableBeans) {
            this.disposableBeans.put(beanName, bean);
        }
    }

    /**
     * 注册两个bean之间的控制关系,例如内部bean和包含其的外部bean之间
     *
     */
    public void registerContainedBean(String containedBeanName,
        String containingBeanName) {
        synchronized (this.containedBeanMap) {
            // 从containedBeanMap缓存中查找外部bean名为containingBeanName的内部bean集合
            Set<String> containedBeans = this.containedBeanMap
                .get(containingBeanName);
            // 如果没有,刚新建一个存放内部bean的集合,并且存放在containedBeanMap缓存中
            if (containedBeans == null) {
                containedBeans = new LinkedHashSet<String>(8);
                this.containedBeanMap.put(containingBeanName, containedBeans);
            }
            // 将名为containedBeanName的内部bean存放到内部bean集合
            containedBeans.add(containedBeanName);
        }
        // 紧接着调用注册内部bean和外部bean的依赖关系的方法
        registerDependentBean(containedBeanName, containingBeanName);
    }

    /**
     * 注册给定bean的一个依赖bean,给定的bean销毁之前被销毁。
     *
     */
    public void registerDependentBean(String beanName, String dependentBeanName) {
        // 调用SimpleAliasRegistry的canonicalName方法,这方法是将参数beanName当做别名寻找到注册名,并依此递归
        String canonicalName = canonicalName(beanName);
        synchronized (this.dependentBeanMap) {
            // 从dependentBeanMap缓存中找到依赖名为canonicalName这个bean的 依赖bean集合
            Set<String> dependentBeans = this.dependentBeanMap
                .get(canonicalName);
            // 如果为空,则新建一个依赖bean集合,并且存放到dependentBeanMap缓存中
            if (dependentBeans == null) {
                dependentBeans = new LinkedHashSet<String>(8);
                this.dependentBeanMap.put(canonicalName, dependentBeans);
            }
            // 依赖bean集合添加参数2指定的dependentBeanName
            dependentBeans.add(dependentBeanName);
        }
        synchronized (this.dependenciesForBeanMap) {
            // 从dependenciesForBeanMap缓存中找到dependentBeanName要依赖的所有bean集合
            Set<String> dependenciesForBean = this.dependenciesForBeanMap
                .get(dependentBeanName);
            if (dependenciesForBean == null) {
                dependenciesForBean = new LinkedHashSet<String>(8);
                this.dependenciesForBeanMap.put(dependentBeanName,
                    dependenciesForBean);
            }
            dependenciesForBean.add(canonicalName);
        }
    }

    /**
     *  确定是否还存在名为beanName的被依赖关系
     */
    protected boolean hasDependentBean(String beanName) {
        return this.dependentBeanMap.containsKey(beanName);
    }

    /**
     * 返回依赖于指定的bean的所有bean的名称,如果有的话。
     *
     */
    public String[] getDependentBeans(String beanName) {
        Set<String> dependentBeans = this.dependentBeanMap.get(beanName);
        if (dependentBeans == null) {
            return new String[0];
        }
        return StringUtils.toStringArray(dependentBeans);
    }

    /**
     * 返回指定的bean依赖于所有的bean的名称,如果有的话。
     *
     */
    public String[] getDependenciesForBean(String beanName) {
        Set<String> dependenciesForBean = this.dependenciesForBeanMap
            .get(beanName);
        // 如果没有的话返回new String[0]而不是null
        if (dependenciesForBean == null) {
            return new String[0];
        }
        return dependenciesForBean.toArray(new String[dependenciesForBean
            .size()]);
    }

    // 销毁单例
    public void destroySingletons() {
        if (logger.isInfoEnabled()) {
            logger.info("Destroying singletons in " + this);
        }
        // 单例目前销毁标志开始
        synchronized (this.singletonObjects) {
            this.singletonsCurrentlyInDestruction = true;
        }

        // 销毁disponsableBeans缓存中所有单例bean
        synchronized (this.disposableBeans) {
            String[] disposableBeanNames = StringUtils
                .toStringArray(this.disposableBeans.keySet());
            for (int i = disposableBeanNames.length - 1; i >= 0; i--) {
                destroySingleton(disposableBeanNames[i]);
            }
        }

        // containedBeanMap缓存清空,dependentBeanMap缓存清空,dependenciesForBeanMap缓存清空
        this.containedBeanMap.clear();
        this.dependentBeanMap.clear();
        this.dependenciesForBeanMap.clear();

        // singeltonObjects缓存清空,singletonFactories缓存清空,earlySingletonObjects缓存清空,registeredSingletons缓存清空
        synchronized (this.singletonObjects) {
            this.singletonObjects.clear();
            this.singletonFactories.clear();
            this.earlySingletonObjects.clear();
            this.registeredSingletons.clear();
            // 单例目前正在销毁标志为结束
            this.singletonsCurrentlyInDestruction = false;
        }
    }


    public void destroySingleton(String beanName) {
        // Remove a registered singleton of the given name, if any.
        removeSingleton(beanName);

        // Destroy the corresponding DisposableBean instance.
        DisposableBean disposableBean;
        synchronized (this.disposableBeans) {
            disposableBean = (DisposableBean) this.disposableBeans
                .remove(beanName);
        }
        destroyBean(beanName, disposableBean);
    }


    protected void destroyBean(String beanName, DisposableBean bean) {
        // Trigger destruction of dependent beans first...
        // 这段代码告诉我们先移除要销毁依赖bean
        Set<String> dependencies = this.dependentBeanMap.remove(beanName);
        if (dependencies != null) {
            if (logger.isDebugEnabled()) {
                logger.debug("Retrieved dependent beans for bean '" + beanName
                    + "': " + dependencies);
            }
            for (String dependentBeanName : dependencies) {
                destroySingleton(dependentBeanName);
            }
        }

        // Actually destroy the bean now...
        // 销毁bean实例
        if (bean != null) {
            try {
                bean.destroy();
            } catch (Throwable ex) {
                logger.error("Destroy method on bean with name '" + beanName
                    + "' threw an exception", ex);
            }
        }

        // Trigger destruction of contained beans...
        // 从containedBeanMap缓存中移除要销毁的bean,递归移除它的包含内部bean集合
        Set<String> containedBeans = this.containedBeanMap.remove(beanName);
        if (containedBeans != null) {
            for (String containedBeanName : containedBeans) {
                destroySingleton(containedBeanName);
            }
        }

        // Remove destroyed bean from other beans' dependencies.
        // 从其它bean的依赖bean集合中移除要销毁的bean
        synchronized (this.dependentBeanMap) {
            for (Iterator<Map.Entry<String, Set<String>>> it = this.dependentBeanMap
                .entrySet().iterator(); it.hasNext();) {
                Map.Entry<String, Set<String>> entry = it.next();
                Set<String> dependenciesToClean = entry.getValue();
                dependenciesToClean.remove(beanName);
                if (dependenciesToClean.isEmpty()) {
                    it.remove();
                }
            }
        }

        // Remove destroyed bean's prepared dependency information.
        // 最后 从dependenciesForBeanMap缓存中移除要销毁的bean
        this.dependenciesForBeanMap.remove(beanName);
    }

    /**
     * Expose the singleton mutex to subclasses.
     * <p>
     * Subclasses should synchronize on the given Object if they perform any
     * sort of extended singleton creation phase. In particular, subclasses
     * should <i>not</i> have their own mutexes involved in singleton creation,
     * to avoid the potential for deadlocks in lazy-init situations.
     */
    protected final Object getSingletonMutex() {
        return this.singletonObjects;
    }

}


DefaultSingletonBeanRegistry源码详解

原文:http://blog.csdn.net/wconvey/article/details/51119493

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!