Spring源碼分析——BeanFactory體系之抽象類、類分析(一)


  上一篇介紹了BeanFactory體系的所有接口——Spring源碼分析——BeanFactory體系之接口詳細分析,本篇就接着介紹BeanFactory體系的抽象類和接口。

一、BeanFactory的基本類體系結構(類為主):

  上圖可與 Spring源碼分析——BeanFactory體系之接口詳細分析 的圖結合分析,一個以接口為主,一個以類為主(PS:Spring的體系結構要分析清楚,不得不曲線救國啊!不然27寸屏幕給我畫估計都裝不下。)。

具體:

  1、7層的類體系繼承。

  2、AbstractBeanFactory實現了最重要的ConfigurableBeanFactory接口,DefaultSingletonBeanRegistry實現了SingletonBeanRegistry單例類注冊接口,SimpleAliasRegistry實現了AliasRegistry別名注冊接口。

  3、祖先類SimpleAliasRegistry、DefaultSingletonBeanRegistry和子孫類XmlBeanFactory、DefaultListableBeanFactory是完整的類,而中間的類FactoryBeanRegistrySupport、AbstractBeanFactory、AbstractAutowireCapableBeanFactory都是抽象類。

總結:

  具體上來說,XmlBeanFactory光是父類就有6個了,加上自身,總共7層了。實際上分析接口結構就會看到,作為IOC類工廠而言,XmlBeanFactory的類體系結構實際是從祖先AbstractBeanFactory這個類開始的,因為是它實現了BeanFactory的子接口ConfigurableBeanFactory,雖然它繼承自FactoryBeanRegistrySupport,但可以說這只是工廠功能的擴充,擴展了對工廠Bean以及工廠所產生的Bean的操作。

 

二、簡單的別名注冊器——SimpleAliasRegistry

  上篇已經講過AliasRegistry,非常簡單的4個方法,體現了對別名注冊的支持,而SimpleAliasRegistry就是它的簡單實現。

源碼:

public class SimpleAliasRegistry implements AliasRegistry {

    /*
     *用一個支持高並發的ConcurrentHashMap來放置所有的別名
     */
    private final Map<String, String> aliasMap = new ConcurrentHashMap<String, String>(
            16);

    // AliasRegistry的接口方法,注冊別名。不允許重復注冊。
    public void registerAlias(String name, String alias) {
        Assert.hasText(name, "'name' must not be empty");
        Assert.hasText(alias, "'alias' must not be empty");
        if (alias.equals(name)) {
            this.aliasMap.remove(alias);
        } else {
            if (!allowAliasOverriding()) {
                String registeredName = this.aliasMap.get(alias);
                if (registeredName != null && !registeredName.equals(name)) {
                    throw new IllegalStateException("Cannot register alias '"
                            + alias + "' for name '" + name
                            + "': It is already registered for name '"
                            + registeredName + "'.");
                }
            }
            checkForAliasCircle(name, alias);//alias不能等於name在map中最后的對應(詳見checkForAliasCircle方法)
            this.aliasMap.put(alias, name);//alias是key,name是value
        }
    }

    /**
     * 返回是否允許Alias重寫,默認為允許
     */
    protected boolean allowAliasOverriding() {
        return true;
    }

    // AliasRegistry的接口方法,移除別名,如果別名未注冊,則拋出異常
    public void removeAlias(String alias) {
        String name = this.aliasMap.remove(alias);
        if (name == null) {
            throw new IllegalStateException("No alias '" + alias
                    + "' registered");
        }
    }

    // AliasRegistry的接口方法,給定名稱判斷是否為別名
    public boolean isAlias(String name) {
        return this.aliasMap.containsKey(name);
    }

    // AliasRegistry的接口方法
    public String[] getAliases(String name) {
        List<String> result = new ArrayList<String>();
        synchronized (this.aliasMap) {
            retrieveAliases(name, result);
        }
        return StringUtils.toStringArray(result);
    }

    /*
     * 找出名字說對應的所有別名。
     */
    private void retrieveAliases(String name, List<String> result) {
        for (Map.Entry<String, String> entry : this.aliasMap.entrySet()) {//遍歷aliasMap
            String registeredName = entry.getValue();//取aliasMap的每個value
            if (registeredName.equals(name)) {//如果value等於指定的這個name
                String alias = entry.getKey();//取value對應的key
                result.add(alias);//將alias加入
                retrieveAliases(alias, result);//繼續查看以alias為value的key
            }
        }
    }

    /*
     * 處理所有的別名,如果處理正確,把原來的用解析后的替換
     */
    public void resolveAliases(StringValueResolver valueResolver) {
        Assert.notNull(valueResolver, "StringValueResolver must not be null");
        synchronized (this.aliasMap) {
            Map<String, String> aliasCopy = new HashMap<String, String>(
                    this.aliasMap);
            for (String alias : aliasCopy.keySet()) {
                String registeredName = aliasCopy.get(alias);//取出key對應的value
                String resolvedAlias = valueResolver.resolveStringValue(alias);//解析后的key
                String resolvedName = valueResolver
                        .resolveStringValue(registeredName);//解析后的value
                if (resolvedAlias.equals(resolvedName)) {//若解析后的key、name相等,就把它們從aliasMap中移除
                    this.aliasMap.remove(alias);
                } else if (!resolvedAlias.equals(alias)) {//若解析后的key不等於原來的Key
                    String existingName = this.aliasMap.get(resolvedAlias);//取出解析后的key對應的value
                    if (existingName != null//如果不為空且不等於解析后的value,就拋出異常
                            && !existingName.equals(resolvedName)) {
                        throw new IllegalStateException(
                                "Cannot register resolved alias '"
                                        + resolvedAlias
                                        + "' (original: '"
                                        + alias
                                        + "') for name '"
                                        + resolvedName
                                        + "': It is already registered for name '"
                                        + registeredName + "'.");
                    }
                    checkForAliasCircle(resolvedName, resolvedAlias);
                    this.aliasMap.remove(alias);
                    this.aliasMap.put(resolvedAlias, resolvedName);
                } else if (!registeredName.equals(resolvedName)) {
                    this.aliasMap.put(alias, resolvedName);
                }
            }
        }
    }

    /*
     * 根據name這個Key,在aliasMap中不斷循環的取對應的value,如果取得到,就繼續根據這個value取值,不斷循環繼續。
     * 直到取不到,就把這個在aliasMap中無對應值的key返回。
     */
    public String canonicalName(String name) {
        String canonicalName = name;    //規范名
        // Handle aliasing...
        String resolvedName;//已解析名
        do {
            resolvedName = this.aliasMap.get(canonicalName);//aliasMap中規范名對應的值賦值給已解析名
            if (resolvedName != null) {//如果已解析名存在(即規范名在aliasMap中有對應的值)
                canonicalName = resolvedName;   // 這個已解析名賦值給標准名
            }
        } while (resolvedName != null);//不斷循環,直到已解析名不存在
        return canonicalName;
    }

    /*
     * 如果別名alias等於canonicalName(name)就拋出異常
     */
    protected void checkForAliasCircle(String name, String alias) {
        if (alias.equals(canonicalName(name))) {
            throw new IllegalStateException("Cannot register alias '" + alias
                    + "' for name '" + name + "': Circular reference - '"
                    + name + "' is a direct or indirect alias for '" + alias
                    + "' already");
        }
    }

}
View Code

 具體:

  1、1個支持高並發的ConcurrentHashMap來放置所有的別名,其中key是別名,value是真名。

  2、4個方法實現了SimpleAliasRegistry。

  3、3個用來輔助實現4個接口方法的方法。其中canonicalName(String name)的實現非常優雅,用來循環來回判斷,把aliasMap中無對應值的key返回。

  4、2個添加額外功能的方法 retrieveAliases 和 resolveAliases ,前者是找出名字對應的所有別名,后者是用一個StringValueResolver處理解析所有的別名-名稱。

總結:

  這是一個非常簡單的別名注冊器,一個簡單的接口實現。不過其中包含了非常優雅的方法實現,值得一看!

 

三、默認單例注冊類——DefaultSingletonBeanRegistry

源碼:  

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {

    protected static final Object NULL_OBJECT = new Object();//空object


    /** Logger available to subclasses */
    protected final Log logger = LogFactory.getLog(getClass());

    /** 單例緩存: bean name --> bean instance */
    private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(64);

    /** 單例工廠緩存: bean name --> ObjectFactory */
    private final Map<String, ObjectFactory> singletonFactories = new HashMap<String, ObjectFactory>(16);

    /** 早期單例對象緩存: bean name --> bean instance */
    private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16);

    /** 注冊過的單例類(單例工廠) */
    private final Set<String> registeredSingletons = new LinkedHashSet<String>(64);

    /** 即將創建的單例類 (using a ConcurrentHashMap as a Set) */
    private final Map<String, Boolean> singletonsCurrentlyInCreation = new ConcurrentHashMap<String, Boolean>(16);

    /** 正在創建的單例類 (using a ConcurrentHashMap as a Set) */
    private final Map<String, Boolean> inCreationCheckExclusions = new ConcurrentHashMap<String, Boolean>(16);

    /** 被壓制的異常集合 */
    private Set<Exception> suppressedExceptions;

    /** 單例類是否真正被銷毀 */
    private boolean singletonsCurrentlyInDestruction = false;

    /** Disposable接口的實例: bean name --> disposable instance */
    private final Map<String, Object>   = new LinkedHashMap<String, Object>();

    /** bean名稱和bean所有包含的Bean的名稱的map: bean name --> Set of bean names that the bean contains */
    private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<String, Set<String>>(16);

    /** bean名稱和所有依賴於Bean的名稱的map: bean name --> Set of dependent bean names */
    private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<String, Set<String>>(64);

    /** bean名稱和bean所依賴的所有名稱的map --> Set of bean names for the bean's dependencies */
    private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<String, Set<String>>(64);

    //SingletonBeanRegistry接口的實現類————注冊單例Bean,不能重復注冊
    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);
            if (oldObject != null) {
                throw new IllegalStateException("Could not register object [" + singletonObject +
                        "] under bean name '" + beanName + "': there is already object [" + oldObject + "] bound");
            }
            addSingleton(beanName, singletonObject);
        }
    }

    //注冊一個單例類,注冊之后,從singletonFactories、earlySingletonObjects中刪去
    protected void addSingleton(String beanName, Object singletonObject) {
        synchronized (this.singletonObjects) {
            this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));
            this.singletonFactories.remove(beanName);
            this.earlySingletonObjects.remove(beanName);//
            this.registeredSingletons.add(beanName);//加入,注冊過的單例類集合
        }
    }

    //注冊一個單例工廠類,注冊后從earlySingletonObjects移除
    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);
            }
        }
    }

    //SingletonBeanRegistry接口的實現類
    public Object getSingleton(String beanName) {
        return getSingleton(beanName, true);
    }

    //根據beanName返回單例類
    protected Object getSingleton(String beanName, boolean allowEarlyReference) {
        Object singletonObject = this.singletonObjects.get(beanName);
        if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {    //    如果取不到,且該bean正在創建
            synchronized (this.singletonObjects) {
                singletonObject = this.earlySingletonObjects.get(beanName);
                if (singletonObject == null && allowEarlyReference) {    //    如果從早期單例緩存中獲取不到,且允許早期引用
                    ObjectFactory singletonFactory = this.singletonFactories.get(beanName);    //    那么就從單例工廠緩存中獲取單例工廠
                    if (singletonFactory != null) {    //    如果還是獲取不到,就創建一個單例工廠,並把它放進早期單例緩存中,並返回
                        singletonObject = singletonFactory.getObject();
                        this.earlySingletonObjects.put(beanName, singletonObject);
                        this.singletonFactories.remove(beanName);
                    }
                }
            }
        }
        return (singletonObject != NULL_OBJECT ? singletonObject : null);
    }

    //獲取指定的單例Bean,如果取不到就調用指定的singletonFactory的getObject來返回
    public Object getSingleton(String beanName, ObjectFactory singletonFactory) {
        Assert.notNull(beanName, "'beanName' must not be null");
        synchronized (this.singletonObjects) {
            Object singletonObject = this.singletonObjects.get(beanName);//從單例緩存中獲取
            if (singletonObject == null) {
                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 + "'");
                }
                //如果不在inCreationCheckExclusions中,且可以向singletonsCurrentlyInCreation中添加,就拋出異常
                beforeSingletonCreation(beanName);
                //是否有記錄被壓制的異常
                boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
                if (recordSuppressedExceptions) {//如果沒有記錄,即沒有被壓制的異常,就創建被壓制的異常容器
                    this.suppressedExceptions = new LinkedHashSet<Exception>();
                }
                try {
                    singletonObject = singletonFactory.getObject();//以上都沒有異常產生,那么就從指定的facgtory中取
                }
                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);//取成功就放進singletonObjects中
            }
            return (singletonObject != NULL_OBJECT ? singletonObject : null);
        }
    }

    //添加一個被壓制的異常
    protected void onSuppressedException(Exception ex) {
        synchronized (this.singletonObjects) {
            if (this.suppressedExceptions != null) {
                this.suppressedExceptions.add(ex);
            }
        }
    }

    //根據名稱移除本容器中緩存的對應的單例Bean,把對應的單例從Bean集合、單例工廠集合、早期單例對象集合、注冊過的單例集合都統統移除
    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接口的實現類
    public boolean containsSingleton(String beanName) {
        return (this.singletonObjects.containsKey(beanName));
    }

    //SingletonBeanRegistry接口的實現類
    public String[] getSingletonNames() {
        synchronized (this.singletonObjects) {
            return StringUtils.toStringArray(this.registeredSingletons);
        }
    }
    //SingletonBeanRegistry接口的實現類
    public int getSingletonCount() {
        synchronized (this.singletonObjects) {
            return this.registeredSingletons.size();
        }
    }

    // 設置某個Bean是否正在創建
    public void setCurrentlyInCreation(String beanName, boolean inCreation) {
        Assert.notNull(beanName, "Bean name must not be null");
        if (!inCreation) {
            this.inCreationCheckExclusions.put(beanName, Boolean.TRUE);
        }
        else {
            this.inCreationCheckExclusions.remove(beanName);
        }
    }

    //判斷某個Bean是否正在被創建
    public boolean isCurrentlyInCreation(String beanName) {
        Assert.notNull(beanName, "Bean name must not be null");
        return (!this.inCreationCheckExclusions.containsKey(beanName) && isActuallyInCreation(beanName));
    }

    protected boolean isActuallyInCreation(String beanName) {
        return isSingletonCurrentlyInCreation(beanName);
    }

    //是否即將被創建
    public boolean isSingletonCurrentlyInCreation(String beanName) {
        return this.singletonsCurrentlyInCreation.containsKey(beanName);
    }

    //單例類創建開始之前調用
    //如果不在正在創建的單例類集合中,且可以向即將創建的單例類中添加,就拋出異常
    protected void beforeSingletonCreation(String beanName) {
        if (!this.inCreationCheckExclusions.containsKey(beanName) &&
                this.singletonsCurrentlyInCreation.put(beanName, Boolean.TRUE) != null) {
            throw new BeanCurrentlyInCreationException(beanName);
        }
    }

    //單例類創建之后調用
    //如果不在正在創建的單例類中,也不在即將創建的單例類中移除失敗,就拋出異常
    protected void afterSingletonCreation(String beanName) {
        if (!this.inCreationCheckExclusions.containsKey(beanName) &&
                !this.singletonsCurrentlyInCreation.remove(beanName)) {
            throw new IllegalStateException("Singleton '" + beanName + "' isn't currently in creation");
        }
    }

    //往Disposable實例集合注冊Disposable實例
    public void registerDisposableBean(String beanName, DisposableBean bean) {
        synchronized (this.disposableBeans) {
            this.disposableBeans.put(beanName, bean);
        }
    }

    //注冊一個被包含的Bean和一個包含它的Bean(子->父)
    public void registerContainedBean(String containedBeanName, String containingBeanName) {
        synchronized (this.containedBeanMap) {
            Set<String> containedBeans = this.containedBeanMap.get(containingBeanName);
            if (containedBeans == null) {
                containedBeans = new LinkedHashSet<String>(8);//containedBeans的初始容量為8
                this.containedBeanMap.put(containingBeanName, containedBeans);//注意!containedBeanMap的Key是父bean,value是其所包含的所有子Bean(父->子)
            }
            containedBeans.add(containedBeanName);
        }
        registerDependentBean(containedBeanName, containingBeanName);//因為包含也是依賴的一種,所以此時也要注冊在dependentBeanMap中
    }

    //給指定的Bean注冊一個其依賴的Bean
    public void registerDependentBean(String beanName, String dependentBeanName) {
        String canonicalName = canonicalName(beanName);//在aliasMap中取規范名
        synchronized (this.dependentBeanMap) {    //    這里是注冊依賴BeanMap,key是bean的名稱,value是依賴這個bean的所有bean的名稱
            Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName);
            if (dependentBeans == null) {
                dependentBeans = new LinkedHashSet<String>(8);//dependentBeans的初始容量也為8
                this.dependentBeanMap.put(canonicalName, dependentBeans);//dependentBeanMap中Key為beanName的規范名,value是依賴它的所有Bean的名稱
            }
            dependentBeans.add(dependentBeanName);
        }
        synchronized (this.dependenciesForBeanMap) {    //    這里相反,注冊的是某個Bean和其所依賴的Bean的集合,key是這個beanName,value是這個Bean的依賴的所有Bean的Name
            Set<String> dependenciesForBean = this.dependenciesForBeanMap.get(dependentBeanName);
            if (dependenciesForBean == null) {
                dependenciesForBean = new LinkedHashSet<String>(8);
                this.dependenciesForBeanMap.put(dependentBeanName, dependenciesForBean);
            }
            dependenciesForBean.add(canonicalName);
        }
    }

    //判斷某個Bean是否被其他Bean所依賴
    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);
        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) {//首先標記,所有的單例Bean正在被銷毀,那么getSingleton就無法獲得單例Bean了
            this.singletonsCurrentlyInDestruction = true;
        }

        String[] disposableBeanNames;
        synchronized (this.disposableBeans) {//然后把所有的disposableBean都放進數組,一個個按名稱銷毀
            disposableBeanNames = StringUtils.toStringArray(this.disposableBeans.keySet());
        }
        for (int i = disposableBeanNames.length - 1; i >= 0; i--) {
            destroySingleton(disposableBeanNames[i]);
        }
        //    把本容器的所有的包含關系、依賴關系、被依賴關系的集合全部清空
        this.containedBeanMap.clear();
        this.dependentBeanMap.clear();
        this.dependenciesForBeanMap.clear();

        //然后把本容器的所有其他集合全部清空
        synchronized (this.singletonObjects) {
            this.singletonObjects.clear();
            this.singletonFactories.clear();
            this.earlySingletonObjects.clear();
            this.registeredSingletons.clear();
            this.singletonsCurrentlyInDestruction = false;
        }
    }

    //銷毀某個單例Bean
    public void destroySingleton(String beanName) {
        // Remove a registered singleton of the given name, if any.
        removeSingleton(beanName);//先把它銷毀

        DisposableBean disposableBean;//它相應的DisposableBean實例
        synchronized (this.disposableBeans) {
            disposableBean = (DisposableBean) this.disposableBeans.remove(beanName);//從disposableBeans移除這個實例
        }
        destroyBean(beanName, disposableBean);
    }

    // 銷毀指定名稱的Bean,且銷毀依賴於它的所有Bean
    protected void destroyBean(String beanName, DisposableBean bean) {
        // 首先銷毀依賴它的所有Bean
        Set<String> dependencies = this.dependentBeanMap.remove(beanName);//取依賴於指定Bean的所有Bean
        if (dependencies != null) {
            if (logger.isDebugEnabled()) {
                logger.debug("Retrieved dependent beans for bean '" + beanName + "': " + dependencies);
            }
            for (String dependentBeanName : dependencies) {
                destroySingleton(dependentBeanName);//一個個銷毀
            }
        }

        // 然后銷毀它
        if (bean != null) {
            try {
                bean.destroy();
            }
            catch (Throwable ex) {
                logger.error("Destroy method on bean with name '" + beanName + "' threw an exception", ex);
            }
        }

        // 然后銷毀它所包含的Bean
        Set<String> containedBeans = this.containedBeanMap.remove(beanName);
        if (containedBeans != null) {
            for (String containedBeanName : containedBeans) {
                destroySingleton(containedBeanName);
            }
        }

        // 然后把所有它依賴的Bean的依賴關系刪除,首先刪除dependentBeanMap中的依賴關系
        synchronized (this.dependentBeanMap) {
            //這樣的for循環用法實在是經典
            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();
                }
            }
        }

        // 然后刪除dependenciesForBeanMap中的依賴關系
        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;
    }

}
View Code

 

具體:

  1、一個靜態不可變的空對象NULL_OBJECT、一個簡單的日志對象。

  2、本類有如下集合:

    (1)、一個單例緩存集合——singletonObjects

    (2)、一個單例工廠緩存集合——singletonFactories

    (3)、一個早期單例對象緩存集合——earlySingletonObjects

    (4)、一個注冊過的單例類(單例工廠)集合——registeredSingletons

    (5)、一個即將創建的單例類集合——singletonsCurrentlyInCreation

    (6)、一個正在創建的單例類集合——inCreationCheckExclusions

    (7)、一個被壓制的異常集合——suppressedExceptions(這種設計模式實在是經典!)

    (8)、一個判斷所有單例類是否馬上被銷毀的標記——singletonsCurrentlyInDestruction

    (9)、一個Disposable接口(即可以自定義回收資源的接口)實例的集合——disposableBeans

    (10)、一個bean名稱和bean所有包含的Bean的名稱的集合——containedBeanMap

    (11)、bean名稱和所有依賴於Bean的名稱的集合——dependentBeanMap

    (12)、bean名稱和bean所依賴的所有名稱的集合——dependenciesForBeanMap

  3、2個注冊單例方法,實際是暴露在外的SingletonBeanRegistry接口的實現方法registerSingleton加鎖后調用另一個addSingleton方法。

  4、1個注冊單例工廠的方法。單例工廠類不能和單例類同名。

  5、3個獲取單例類的方法。一種是從單例類集合中獲取,如果獲取不到,boolean控制要么返回空對象,要么返回一個單例工廠。另一種是從單例集合中獲取,如果取不到,就從指定的工廠中獲取。還有一種?呵,就是暴露在外的SingletonBeanRegistry接口方法唄,直接調用第一種。

  6、1個添加被壓制的異常集合中添加異常的方法,我覺得這個設計非常經典。但需要記錄異常,卻不想處理的時候,可以采用這種設計模式。

  7、1個移除單例的方法、1個判斷是否包含單例的方法、1個返回所有單例名數組的方法、1個返回單例總數目的方法。

  8、1個設置某個Bean是否正在創建的方法、1個判斷某個Bean是否正在被創建的方法、2個判斷某個Bean是否即將被創建的方法(一個調用另一個,用於重寫)。

  9、1個單例類創建開始之前調用的方法、1個單單例類創建之后調用的方法

  10、1個往Disposable實例集合注冊Disposable實例的方法,這個是Bean銷毀前的准備。

  11、1個注冊一個被包含的Bean和一個包含的Bean的名稱到containedBeanMap集合的方法。這個方法設置了Bean之間的包含關系。

  12、1個給指定的Bean注冊一個其依賴的Bean的方法。這個方法設置了Bean自己的依賴關系。

  13、1個判斷是否被依賴的方法、1個返回給定Bean名稱的所有依賴的數組的方法、1個返回依賴於給定Bean的所有Bean名的數組的方法。

  14、1個銷毀所有單例類的方法(這個方法居然完全沒有注釋,有沒搞錯!)、1個銷毀某個單例的方法、1個// 銷毀指定名稱的Bean,且銷毀依賴於它的所有Bean的方法。

  15、1個返回子類單例類的互斥體的方法。這個暫且待下一篇分析子類再看。

總結:

  類如其名,默認的單例注冊器。這個工廠的寫法實在功能豐富,為了監控到一個單例類構建過程中的方方面面,簡直就是不擇手段啊,居然准備了12個集合,除了一個一個被壓制的異常集合,其余全是跟單例類有直接關系的。可以說,這個單例注冊器監聽、實現了Spring單例注冊的各個過程,具體的解讀分析,在上面的源代碼中可以看到,讀者閱讀我注釋過的源代碼應該會很輕松。

 

  源碼分析,路漫漫其修遠啊。這個DefaultSingletonBeanRegistry實在是讓我有些元氣大傷。一個簡單的單例注冊,復雜的讓人咋舌!Spring容器對單例類的監聽考慮之完備,令人佩服。閱讀源碼,對系統構建和功能實現的理解實在有用!嗯!要加快進度才行!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM