国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-14 21:42:40
字體:
來源:轉載
供稿:網友
SPRing源碼分析——BeanFactory體系之抽象類、類分析(二)

  上一篇分析了BeanFactory體系的2個類,SimpleAliasRegistry和DefaultSingletonBeanRegistry——Spring源碼分析——BeanFactory體系之抽象類、類分析(一),今天繼續分析。

一、工廠Bean注冊支持——FactoryBeanRegistrySupport

廢話不多說,直接看我注釋的源碼:

/* * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.springframework.beans.factory.support;import java.security.accessControlContext;import java.security.AccessController;import java.security.PrivilegedAction;import java.security.PrivilegedActionException;import java.security.PrivilegedExceptionAction;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;import org.springframework.beans.BeansException;import org.springframework.beans.factory.BeanCreationException;import org.springframework.beans.factory.BeanCurrentlyInCreationException;import org.springframework.beans.factory.FactoryBean;import org.springframework.beans.factory.FactoryBeanNotInitializedException;/** * Support base class for singleton registries which need to handle * {@link org.springframework.beans.factory.FactoryBean} instances, * integrated with {@link DefaultSingletonBeanRegistry}'s singleton management. * * <p>Serves as base class for {@link AbstractBeanFactory}. * * @author Juergen Hoeller * @since 2.5.1 */public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanRegistry {    /** 工廠Bean生產的單例的集合: FactoryBean name --> object */    private final Map<String, Object> factoryBeanObjectCache = new ConcurrentHashMap<String, Object>(16);    //返回指定FactoryBean的類型    protected Class getTypeForFactoryBean(final FactoryBean factoryBean) {        try {            if (System.getSecurityManager() != null) {//如果當前系統存在安全管理器                return AccessController.doPrivileged(new PrivilegedAction<Class>() {//那么返回factoryBean的類型這個操作不做權限檢查,直接調用                    public Class run() {                        return factoryBean.getObjectType();                    }                }, getAccessControlContext());            }            else {//不存在安全管理器,就直接調用!                return factoryBean.getObjectType();            }        }        catch (Throwable ex) {            logger.warn("FactoryBean threw exception from getObjectType, despite the contract saying " +                    "that it should return null if the type of its object cannot be determined yet", ex);            return null;        }    }    //根據FactoryBean名,返回其生產的Object,從緩存中取    protected Object getCachedObjectForFactoryBean(String beanName) {        Object object = this.factoryBeanObjectCache.get(beanName);        return (object != NULL_OBJECT ? object : null);    }    //從工廠Bean中取實例,實際調用下面的doGetObjectFromFactoryBean方法。    protected Object getObjectFromFactoryBean(FactoryBean factory, String beanName, boolean shouldPostProcess) {        if (factory.isSingleton() && containsSingleton(beanName)) {//若工廠是單例,且本容器包含beanName對應的單例類            synchronized (getSingletonMutex()) {//以所有的單例集合為鎖                Object object = this.factoryBeanObjectCache.get(beanName);//根據beanName從factoryBeanObjectCache中取                if (object == null) {//若取不到                    object = doGetObjectFromFactoryBean(factory, beanName, shouldPostProcess);                    this.factoryBeanObjectCache.put(beanName, (object != null ? object : NULL_OBJECT));//放進factoryBeanObjectCache                }                return (object != NULL_OBJECT ? object : null);            }        }        else {//否則,直接            return doGetObjectFromFactoryBean(factory, beanName, shouldPostProcess);        }    }    //從工廠Bean中取實例    private Object doGetObjectFromFactoryBean(            final FactoryBean factory, final String beanName, final boolean shouldPostProcess)            throws BeanCreationException {        Object object;        //跟getTypeForFactoryBean的實現一樣。        try {            if (System.getSecurityManager() != null) {//若系統存在安全管理器                AccessControlContext acc = getAccessControlContext();//得到當前容器的安全訪問上下文                try {//返回factoryBean的類型這個操作不做權限檢查,直接調用                    object = AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {                        public Object run() throws Exception {                                return factory.getObject();                            }                        }, acc);                }                catch (PrivilegedActionException pae) {                    throw pae.getException();                }            }            else {//否則直接取                object = factory.getObject();            }        }        catch (FactoryBeanNotInitializedException ex) {            throw new BeanCurrentlyInCreationException(beanName, ex.toString());        }        catch (Throwable ex) {            throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);        }        //如果從beanFactory取不到,且這個實例即將被創建,拋出異常        if (object == null && isSingletonCurrentlyInCreation(beanName)) {            throw new BeanCurrentlyInCreationException(                    beanName, "FactoryBean which is currently in creation returned null from getObject");        }        //若取不到,且這個實例允許前處理        if (object != null && shouldPostProcess) {            try {                object = postProcessObjectFromFactoryBean(object, beanName);//這里簡單返回,前處理的功能留給子類重寫            }            catch (Throwable ex) {                throw new BeanCreationException(beanName, "Post-processing of the FactoryBean's object failed", ex);            }        }        return object;    }    //這里簡單返回Object,留給子類重寫    protected Object postProcessObjectFromFactoryBean(Object object, String beanName) throws BeansException {        return object;    }    //如果這個Object是FactoryBean類型,就轉換成FactoryBean返回    protected FactoryBean getFactoryBean(String beanName, Object beanInstance) throws BeansException {        if (!(beanInstance instanceof FactoryBean)) {            throw new BeanCreationException(beanName,                    "Bean instance of type [" + beanInstance.getClass() + "] is not a FactoryBean");        }        return (FactoryBean) beanInstance;    }    //移除單例類這個方法重寫,父類的移除之外,還要移除factoryBeanObjectCache中的。    @Override    protected void removeSingleton(String beanName) {        super.removeSingleton(beanName);        this.factoryBeanObjectCache.remove(beanName);    }    //返回當前容器的安全訪問上下文    protected AccessControlContext getAccessControlContext() {        return AccessController.getContext();    }}
View Code

具體:

  1、1個不可變的實例屬性ConcurrentHashMap來存放工廠Bean生產的單例的集合:FactoryBean name --> object。

  2、1個方法返回指定FactoryBean的類型的方法。

  3、1個根據FactoryBean名,返回其生產的Object的方法。

  4、2個從工廠Bean中取實例的方法。實際是一個方法調用另一個,取不到則返回空。

  5、1個postProcessObjectFromFactoryBean的方法,留給子類重寫。

  6、1個取工廠Bean的方法——如果這個Object是FactoryBean類型,就轉換成FactoryBean返回

  7、1個重寫父類的removeSingleton方法,移除單例的時候,父類的移除之外,還要移除factoryBeanObjectCache中的。

  8、1個返回當前容器的安全訪問上下文的方法。

總結:

  這個類FactoryBeanRegistrySupport,類如其名,實現了對工廠Bean注冊的支持。值得注意的是,這個類有較多類似如下的寫法:

    if (System.getSecurityManager() != null) {//如果當前系統存在安全管理器                return AccessController.doPrivileged(new PrivilegedAction<Class>() {                    public Class run() {                        //實際處理                    }                }, getAccessControlContext());            }            else {//不存在安全管理器,就直接調用!                //實際處理            }        

  這個方法的意思是,如果當前系統存在安全管理器,那么接下來的操作不做權限檢查,直接調用。而如果不存在,OK,那當然是直接調用了。這是JDK層面的一個系統安全管理工具,某些情況下,可以避免系統進行安全檢查。這里稍作了解即可。在學習JVM的時候可仔細了解原理。

  除此之外,這里可以了解一下這個類比較重要的方法doGetObjectFromFactoryBean,是從工廠Bean中取實例的方法,源碼已經給出,這里重點指出一下,不必折疊了:

//從工廠Bean中取實例,shouldPostProcess指的是是否允許提前處理    private Object doGetObjectFromFactoryBean(            final FactoryBean factory, final String beanName, final boolean shouldPostProcess)            throws BeanCreationException {        Object object;        //跟getTypeForFactoryBean的實現一樣。        try {            if (System.getSecurityManager() != null) {//若系統存在安全管理器                AccessControlContext acc = getAccessControlContext();//得到當前容器的安全訪問上下文                try {//返回factoryBean的類型這個操作不做權限檢查,直接調用                    object = AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {                        public Object run() throws Exception {                                return factory.getObject();                            }                        }, acc);                }                catch (PrivilegedActionException pae) {                    throw pae.getException();                }            }            else {//否則直接取                object = factory.getObject();            }        }        catch (FactoryBeanNotInitializedException ex) {            throw new BeanCurrentlyInCreationException(beanName, ex.toString());        }        catch (Throwable ex) {            throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);        }        //如果從beanFactory取不到,且這個實例即將被創建,拋出異常        if (object == null && isSingletonCurrentlyInCreation(beanName)) {            throw new BeanCurrentlyInCreationException(                    beanName, "FactoryBean which is currently in creation returned null from getObject");        }        //若取不到,并非即將創建、且這個實例允許前處理        if (object != null && shouldPostProcess) {            try {                object = postProcessObjectFromFactoryBean(object, beanName);//這里簡單返回,前處理的功能留給子類重寫            }            catch (Throwable ex) {                throw new BeanCreationException(beanName, "Post-processing of the FactoryBean's object failed", ex);            }        }        return object;    }

  相信上面已經解釋的很清楚了。

二、最重要的抽象類——AbstractBeanFactory

  (PS:這個類的方法實在是多的駭人,看得我實在是頭都大了。不多看到后面,發現很多方法其實也就是那么回事。源碼注釋了大部分,且看看咯!)

public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {    //父工廠的引用    private BeanFactory parentBeanFactory;    //類加載器    private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader();    //臨時類加載器    private ClassLoader tempClassLoader;    /** Whether to cache bean metadata or rather reobtain it for every access */    private boolean cacheBeanMetadata = true;    //Bean表達式分解器,用來分解Bean定義中的表達式    private BeanExpressionResolver beanExpressionResolver;    //轉換服務,用來替代屬性編輯器的    private ConversionService conversionService;    //屬性編輯登記員集合,容量為4的LinkedHashSet    private final Set<PropertyEditorRegistrar> propertyEditorRegistrars =            new LinkedHashSet<PropertyEditorRegistrar>(4);    //通用的類型轉換器,重寫了默認的屬相編輯器機制    private TypeConverter typeConverter;    //默認的屬性編輯器集合    private final Map<Class<?>, Class<? extends PropertyEditor>> customEditors =            new HashMap<Class<?>, Class<? extends PropertyEditor>>(4);    //嵌入值轉換器集合    private final List<StringValueResolver> embeddedValueResolvers = new LinkedList<StringValueResolver>();    //BeanPostProcessor處理器集合    private final List<BeanPostProcessor> beanPostProcessors = new ArrayList<BeanPostProcessor>();    //標記是否有InstantiationAwareBeanPostProcessors實例被注冊    private boolean hasInstantiationAwareBeanPostProcessors;    //標記是否有DestructionAwareBeanPostProcessors實例被注冊    private boolean hasDestructionAwareBeanPostProcessors;    //范圍標識符和Scope實例的對應的Map    private final Map<String, Scope> scopes = new HashMap<String, Scope>(8);    //安全上下文Provider,可以得到安全管理器的安全上下文    private SecurityContextProvider securityContextProvider;    //合并后的Bean根定義的集合    private final Map<String, RootBeanDefinition> mergedBeanDefinitions =            new ConcurrentHashMap<String, RootBeanDefinition>(64);    //至少被創建過一次的Bean的集合    private final Map<String, Boolean> alreadyCreated = new ConcurrentHashMap<String, Boolean>(64);    //當前正在創建的原型,當前線程相關    private final ThreadLocal<Object> prototypesCurrentlyInCreation =            new NamedThreadLocal<Object>("Prototype beans currently in creation");    //空構造方法    public AbstractBeanFactory() {    }    //指定父Bean工廠的構造方法    public AbstractBeanFactory(BeanFactory parentBeanFactory) {        this.parentBeanFactory = parentBeanFactory;    }    //---------------------------------------------------------------------    // 3個getBean,BeanFactory接口的實現方法,實質是在調用doGetBean    //---------------------------------------------------------------------    public Object getBean(String name) throws BeansException {        return doGetBean(name, null, null, false);    }    public <T> T getBean(String name, Class<T> requiredType) throws BeansException {        return doGetBean(name, requiredType, null, false);    }    public Object getBean(String name, Object... args) throws BeansException {        return doGetBean(name, null, args, false);    }    //    提供創建時需要參數列表的getBean    public <T> T getBean(String name, Class<T> requiredType, Object... args) throws BeansException {        return doGetBean(name, requiredType, args, false);    }    //從容器中獲取bean的基本方法。    @SuppressWarnings("unchecked")    protected <T> T doGetBean(            final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)            throws BeansException {        final String beanName = transformedBeanName(name);//在aliasMap中取得的標準名        Object bean;        // Eagerly check singleton cache for manually registered singletons.        Object sharedInstance = getSingleton(beanName);//首先在單例集合中取        if (sharedInstance != null && args == null) {//如果取得到,沒有指定參數            if (logger.isDebugEnabled()) {//若Log允許調試                if (isSingletonCurrentlyInCreation(beanName)) {//若正準備創建,輸出日志                    logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +                            "' that is not fully initialized yet - a consequence of a circular reference");                }                else {                    logger.debug("Returning cached instance of singleton bean '" + beanName + "'");                }            }            ////根據給定的實例是否為工廠Bean,返回它自己或工廠Bean創建的實例            bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);        }        else {            if (isPrototypeCurrentlyInCreation(beanName)) {//如果正在被創建,就拋出異常                throw new BeanCurrentlyInCreationException(beanName);            }            BeanFactory parentBeanFactory = getParentBeanFactory();//取本容器的父容器            if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {//若存在父容器,且本容器不存在對應的Bean定義                String nameToLookup = originalBeanName(name);//取原始的Bean名                if (args != null) {//若參數列表存在                    // 那么用父容器根據原始Bean名和參數列表返回                    return (T) parentBeanFactory.getBean(nameToLookup, args);                }                else {                    // 參數列表不要求,那就直接根據原始名稱和要求的類型返回                    return parentBeanFactory.getBean(nameToLookup, requiredType);                }            }            //如果不需要類型檢查,標記其已經被創建            if (!typeCheckOnly) {                markBeanAsCreated(beanName);            }            //根據beanName取其根Bean定義            final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);            checkMergedBeanDefinition(mbd, beanName, args);            String[] dependsOn = mbd.getDependsOn();//得到這個根定義的所有依賴            if (dependsOn != null) {                for (String dependsOnBean : dependsOn) {                    getBean(dependsOnBean);//注冊這個Bean                    //注冊一個Bean和依賴于它的Bean(后參數依賴前參數)                    registerDependentBean(dependsOnBean, beanName);                }            }            // 如果Bean定義是單例,就在返回單例            if (mbd.isSingleton()) {                sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {                    public Object getObject() throws BeansException {                        try {                            return createBean(beanName, mbd, args);                        }                        catch (BeansException ex) {                            destroySingleton(beanName);                            throw ex;                        }                    }                });                //根據給定的實例是否為工廠Bean,返回它自己或工廠Bean創建的實例                bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);            }            //如果是原型            else if (mbd.isPrototype()) {                // It's a prototype -> create a new instance.                Object prototypeInstance = null;                try {                    beforePrototypeCreation(beanName);//原型創建前,與當前線程綁定                    prototypeInstance = createBean(beanName, mbd, args);                }                finally {                    afterPrototypeCreation(beanName);//原型創建后,與當前線程解除綁定                }                bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);            }            else {//既不是單例又不是原型的情況                String scopeName = mbd.getScope();                final Scope scope = this.scopes.get(scopeName);//得到范圍                if (scope == null) {                    throw new IllegalStateException("No Scope registered for scope '" + scopeName + "'");                }                try {//根據范圍創建實例                    Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() {                        public Object getObject() throws BeansException {                            beforePrototypeCreation(beanName);                            try {                                return createBean(beanName, mbd, args);//原型創建前,與當前線程綁定                            }                            finally {                                ////原型創建后,與當前線程解除綁定                                afterPrototypeCreation(beanName);                            }                        }                    });                    //根據給定的實例是否為工廠Bean,返回它自己或工廠Bean創建的實例                    bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);                }                catch (IllegalStateException ex) {                    throw new BeanCreationException(beanName,                            "Scope '" + scopeName + "' is not active for the current thread; " +                            "consider defining a scoped proxy for this bean if you intend to refer to it from a singleton",                            ex);                }            }        }        //判斷要求的類型是否和Bean實例的類型正在匹配        if (requiredType != null && bean != null && !requiredType.isAssignableFrom(bean.getClass())) {            try {                return getTypeConverter().convertIfNecessary(bean, requiredType);//轉換類型,不拋出異常就說明類型匹配            }            catch (TypeMismatchException ex) {                if (logger.isDebugEnabled()) {                    logger.debug("Failed to convert bean '" + name + "' to required type [" +                            ClassUtils.getQualifiedName(requiredType) + "]", ex);                }                throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());            }        }        return (T) bean;    }        //判斷本容器是否包含指定bean    public boolean containsBean(String name) {        String beanName = transformedBeanName(name);        //    (如果是否包含單例 或 包含Bean定義)且 (為工廠Bean的產物 或 本身就是工廠bean),就返回true        if (containsSingleton(beanName) || containsBeanDefinition(beanName)) {            return (!BeanFactoryUtils.isFactoryDereference(name) || isFactoryBean(name));        }        // 如果不包含單例且不包含Bean定義,就從父類去查找        BeanFactory parentBeanFactory = getParentBeanFactory();        return (parentBeanFactory != null && parentBeanFactory.containsBean(originalBeanName(name)));    }    //判斷指定Bean是否為單例    public boolean isSingleton(String name) throws NoSuchBeanDefinitionException {        String beanName = transformedBeanName(name);        Object beanInstance = getSingleton(beanName, false);//首先從單例集合中取        if (beanInstance != null) {//取不到,就判斷它是不是FactoryBean的實例            if (beanInstance instanceof FactoryBean) {    //    如果是,要求它是工廠Bean產生的實例或這個工廠bean是單例                return (BeanFactoryUtils.isFactoryDereference(name) || ((FactoryBean<?>) beanInstance).isSingleton());            }            else {//    如果不是,要求它不是工廠Bean產生的實例                return !BeanFactoryUtils.isFactoryDereference(name);            }        }//若雖然取不到,但是單例集合中包含它的名字,說明它是單例        else if (containsSingleton(beanName)) {            return true;        }        else {            //從父工廠中去查詢Bean定義            BeanFactory parentBeanFactory = getParentBeanFactory();            if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {                //父工廠找不到Bean定義,那就在父工廠根據原始名去查是否為單例                return parentBeanFactory.isSingleton(originalBeanName(name));            }            //返回一個合并后的根Bean定義            RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);            // In case of FactoryBean, return singleton status of created object if not a dereference.            //若該根定義是單例            if (mbd.isSingleton()) {                if (isFactoryBean(beanName, mbd)) {    //若該根定義為工廠Bean                    if (BeanFactoryUtils.isFactoryDereference(name)) {//判斷是否為工廠產生的實例                        return true;                    }                    //取對應的工廠,判斷該工廠Bean是否為單例                    FactoryBean<?> factoryBean = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);                    return factoryBean.isSingleton();                }                else {    //    是否不為工廠Bean產生的實例(此時,即,該根定義不為工廠Bean,且不為工廠Bean產生的實例的時候,由于根定義是單例,那么它就是單例)                    return !BeanFactoryUtils.isFactoryDereference(name);                }            }            else {                return false;            }        }    }    //判斷是否為原型    public boolean isPrototype(String name) throws NoSuchBeanDefinitionException {        String beanName = transformedBeanName(name);        BeanFactory parentBeanFactory = getParentBeanFactory();//得到父工廠        //若父工廠中的定義為原型,就為原型        if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {            return parentBeanFactory.isPrototype(originalBeanName(name));        }        //若合并后的根定義為原型,且不是工廠Bean產生的實例、或本身是工廠Bean,那么就為原型        RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);        if (mbd.isPrototype()) {            return (!BeanFactoryUtils.isFactoryDereference(name) || isFactoryBean(beanName, mbd));        }        else {            if (BeanFactoryUtils.isFactoryDereference(name)) {//若為工廠Bean產生的實例                return false;            }            if (isFactoryBean(beanName, mbd)) {//若為工廠Bean,取它產生的Bean,判斷SmartFactoryBean                final FactoryBean<?> factoryBean = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);                if (System.getSecurityManager() != null) {                    return AccessController.doPrivileged(new PrivilegedAction<Boolean>() {                        public Boolean run() {                            return ((factoryBean instanceof SmartFactoryBean && ((SmartFactoryBean<?>) factoryBean).isPrototype()) ||                                    !factoryBean.isSingleton());                        }                    }, getAccessControlContext());                }                else {                    return ((factoryBean instanceof SmartFactoryBean && ((SmartFactoryBean<?>) factoryBean).isPrototype()) ||                            !factoryBean.isSingleton());                }            }            else {                return false;            }        }    }    //判斷類型是否匹配    public boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException {        String beanName = transformedBeanName(name);        Class<?> typeToMatch = (targetType != null ? targetType : Object.class);        Object beanInstance = getSingleton(beanName, false);//取name對應的單例        if (beanInstance != null) {            if (beanInstance instanceof FactoryBean) {//若為工廠Bean                //若不是工廠Bean產生的實例                if (!BeanFactoryUtils.isFactoryDereference(name)) {                    //取工廠Bean的類型與targetType進行對比                    Class<?> type = getTypeForFactoryBean((FactoryBean<?>) beanInstance);                    return (type != null && ClassUtils.isAssignable(typeToMatch, type));                }                else {                    return ClassUtils.isAssignableValue(typeToMatch, beanInstance);                }            }            //不是工廠Bean,那就直接判斷            else {                return !BeanFactoryUtils.isFactoryDereference(name) &&                        ClassUtils.isAssignableValue(typeToMatch, beanInstance);            }        }        //單例表中,對應的Key沒有值,也不包含Bean定義,說明沒有注冊,返回false        else if (containsSingleton(beanName) && !containsBeanDefinition(beanName)) {            return false;        }        //以下是包含Bean定義的情況        else {            //先查父類的Bean定義            BeanFactory parentBeanFactory = getParentBeanFactory();            if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {                // No bean definition found in this factory -> delegate to parent.                return parentBeanFactory.isTypeMatch(originalBeanName(name), targetType);            }                        //直接查合并后的根定義            RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);            //構建類型數組            Class[] typesToMatch = (FactoryBean.class.equals(typeToMatch) ?                    new Class[] {typeToMatch} : new Class[] {FactoryBean.class, typeToMatch});            // Check decorated bean definition, if any: We assume it'll be easier            // to determine the decorated bean's type than the proxy's type.            //得到Bean定義的持有者            BeanDefinitionHolder dbd = mbd.getDecoratedDefinition();            if (dbd != null && !BeanFactoryUtils.isFactoryDereference(name)) {//若為Bean工廠生成的實例,先得到根定義                RootBeanDefinition tbd = getMergedBeanDefinition(dbd.getBeanName(), dbd.getBeanDefinition(), mbd);                Class<?> targetClass = predictBeanType(dbd.getBeanName(), tbd, typesToMatch);//得到預測的根定義                if (targetClass != null && !FactoryBean.class.isAssignableFrom(targetClass)) {                    return typeToMatch.isAssignableFrom(targetClass);                }            }            Class<?> beanType = predictBeanType(beanName, mbd, typesToMatch);//預測后的類型            if (beanType == null) {                return false;            }            if (FactoryBean.class.isAssignableFrom(beanType)) {//BeanFactory是否為其子類                if (!BeanFactoryUtils.isFactoryDereference(name)) {//若不為工廠Bean的產物                    // If it's a FactoryBean, we want to look at what it creates, not the factory class.                    beanType = getTypeForFactoryBean(beanName, mbd);                    if (beanType == null) {                        return false;                    }                }            }            else if (BeanFactoryUtils.isFactoryDereference(name)) {//若為工廠類Bean的產物                beanType = predictBeanType(beanName, mbd, FactoryBean.class);//預測類型                if (beanType == null || !FactoryBean.class.isAssignableFrom(beanType)) {                    return false;                }            }            return typeToMatch.isAssignableFrom(beanType);        }    }    //返回類型    public Class<?> getType(String name) throws NoSuchBeanDefinitionException {        String beanName = transformedBeanName(name);        // Check manually registered singletons.        Object beanInstance = getSingleton(beanName, false);        if (beanInstance != null) {            if (beanInstance instanceof FactoryBean && !BeanFactoryUtils.isFactoryDereference(name)) {                return getTypeForFactoryBean((FactoryBean<?>) beanInstance);            }            else {                return beanInstance.getClass();            }        }        else if (containsSingleton(beanName) && !containsBeanDefinition(beanName)) {            // null instance registered            return null;        }        else {            // No singleton instance found -> check bean definition.            BeanFactory parentBeanFactory = getParentBeanFactory();            if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {                // No bean definition found in this factory -> delegate to parent.                return parentBeanFactory.getType(originalBeanName(name));            }            RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);            // Check decorated bean definition, if any: We assume it'll be easier            // to determine the decorated bean's type than the proxy's type.            BeanDefinitionHolder dbd = mbd.getDecoratedDefinition();            if (dbd != null && !BeanFactoryUtils.isFactoryDereference(name)) {                RootBeanDefinition tbd = getMergedBeanDefinition(dbd.getBeanName(), dbd.getBeanDefinition(), mbd);                Class<?> targetClass = predictBeanType(dbd.getBeanName(), tbd);                if (targetClass != null && !FactoryBean.class.isAssignableFrom(targetClass)) {                    return targetClass;                }            }            Class<?> beanClass = predictBeanType(beanName, mbd);            // Check bean class whether we're dealing with a FactoryBean.            if (beanClass != null && FactoryBean.class.isAssignableFrom(beanClass)) {                if (!BeanFactoryUtils.isFactoryDereference(name)) {                    // If it's a FactoryBean, we want to look at what it creates, not at the factory class.                    return getTypeForFactoryBean(beanName, mbd);                }                else {                    return beanClass;                }            }            else {                return (!BeanFactoryUtils.isFactoryDereference(name) ? beanClass : null);            }        }    }    //重寫了,得到別名的方法。    @Override    public String[] getAliases(String name) {        String beanName = transformedBeanName(name);        List<String> aliases = new ArrayList<String>();        boolean factoryPrefix = name.startsWith(FACTORY_BEAN_PREFIX);        String fullBeanName = beanName;        if (factoryPrefix) {            fullBeanName = FACTORY_BEAN_PREFIX + beanName;        }        if (!fullBeanName.equals(name)) {            aliases.add(fullBeanName);        }        String[] retrievedAliases = super.getAliases(beanName);        for (String retrievedAlias : retrievedAliases) {            String alias = (factoryPrefix ? FACTORY_BEAN_PREFIX : "") + retrievedAlias;            if (!alias.equals(name)) {                aliases.add(alias);            }        }        if (!containsSingleton(beanName) && !containsBeanDefinition(beanName)) {            BeanFactory parentBeanFactory = getParentBeanFactory();            if (parentBeanFactory != null) {                aliases.addAll(Arrays.asList(parentBeanFactory.getAliases(fullBeanName)));            }        }        return StringU
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乌拉特后旗| 广昌县| 宜春市| 湾仔区| 永仁县| 丰都县| 遂川县| 手游| 枣庄市| 稻城县| 郸城县| 榆树市| 阿克苏市| 叙永县| 甘泉县| 英超| 黑山县| 响水县| 稻城县| 昆山市| 厦门市| 侯马市| 贺州市| 平利县| 温宿县| 大安市| 佛坪县| 景东| 边坝县| 浑源县| 灵宝市| 文化| 古田县| 蓬安县| 大同县| 山阳县| 福泉市| 车致| 台北市| 永年县| 新晃|