美文网首页Spring相关时序图系列
Spring IOC(5)AbstractBeanFactory

Spring IOC(5)AbstractBeanFactory

作者: 涣涣虚心0215 | 来源:发表于2020-12-13 15:53 被阅读0次
    DefaultListableBeanFactory继承关系

    在前面我们已经过了BeanFactory,ListableBeanFactory,ConfigurableBeanFactory,AutowireCapableBeanFactory,ConfigurableListableBeanFactory。
    这里我们总结一下:

    • ConfigurableBeanFactory:主要是parentBeanFactory的设置,添加ClassLoader,注册属性编辑器,类型转换器,添加BeanPostProcessor,以及bean的依赖注册和获取。
    • AutowireCapableBeanFactory:主要是用于自动装配,Bean的创建、属性填充、连接(包括自动装配)、初始化和销毁,以及BeanPostProcessor的调用,还有resolveDependency方法声明。
    • ConfigurableListableBeanFactory:主要是对BeanDefinition的解析获取功能,以及预实例化singleton的bean,还包括AutowireCandidate方法声明。

    在看过这么多接口之后,终于有一个实现类了AbstractBeanFactory。

    AbstractBeanFactory

    AbstractBeanFactory实现了ConfigurableBeanFactory,还继承了FactoryBeanRegistrySupport(后面再讲)。到目前为止第一个跟BeanFactory相关的实现类,主要提供了getBean()的各种实现,核心方法是doGetBean()。
    因为实现了ConfigurableBeanFactory,那么就会提供一些与实现相关的成员变量譬如parentBeanFactory,beanClassLoader,propertyEditorRegistrars,typeConverter,beanPostProcessors等。

    public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {
        //提供了getBean的实现doGetBean()
        @Override
        public Object getBean(String name) throws BeansException {
            return doGetBean(name, null, null, false);
        }
        @Override
        public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
            return doGetBean(name, requiredType, null, false);
        }
        @Override
        public Object getBean(String name, Object... args) throws BeansException {
            return doGetBean(name, null, args, false);
        }
        public <T> T getBean(String name, @Nullable Class<T> requiredType, @Nullable Object... args)
                throws BeansException {
    
            return doGetBean(name, requiredType, args, false);
        }
        //实际获取bean的方法
        protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
                @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
            //转化name为beanName
            final String beanName = transformedBeanName(name);
            Object bean;
    
            // getSingleton由DefaultSingletonBeanRegistry实现,用三级缓存解决循环依赖的问题
            Object sharedInstance = getSingleton(beanName);
            //如果缓存中存在该bean
            if (sharedInstance != null && args == null) {
                if (logger.isTraceEnabled()) {
                    if (isSingletonCurrentlyInCreation(beanName)) {
                        logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
                                "' that is not fully initialized yet - a consequence of a circular reference");
                    }
                    else {
                        logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
                    }
                }
                //如果是单例bean,则直接返回;如果是FactoryBean,则返回FactoryBean
                bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
            }
            //缓存中不存在该bean
            else {
                // 如果是prototype类型的,正在创建的bean,就直接报错
                if (isPrototypeCurrentlyInCreation(beanName)) {
                    throw new BeanCurrentlyInCreationException(beanName);
                }
                BeanFactory parentBeanFactory = getParentBeanFactory();
                //检查BeanDefinition是否存在于该BeanFactory
                if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
                    String nameToLookup = originalBeanName(name);
                    //交由parentBeanFactory尝试getBean
                    if (parentBeanFactory instanceof AbstractBeanFactory) {
                        return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
                                nameToLookup, requiredType, args, typeCheckOnly);
                    }
                    else if (args != null) {
                        return (T) parentBeanFactory.getBean(nameToLookup, args);
                    }
                    else if (requiredType != null) {
                        return parentBeanFactory.getBean(nameToLookup, requiredType);
                    }
                    else {
                        return (T) parentBeanFactory.getBean(nameToLookup);
                    }
                }
                if (!typeCheckOnly) {
                    //将该beanName放入alreadyCreated<set>中
                    markBeanAsCreated(beanName);
                }
                try {
                    //获得RootBeanDefinition
                    final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
                    checkMergedBeanDefinition(mbd, beanName, args);
    
                    // 如果有dependsOn的bean,要先进行初始化
                    String[] dependsOn = mbd.getDependsOn();
                    if (dependsOn != null) {
                        for (String dep : dependsOn) {
                            //判断该Dependent是否正在被创建
                            if (isDependent(beanName, dep)) {
                                throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                                        "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
                            }
                            //将DependentBean注册到map中
                            registerDependentBean(dep, beanName);
                            try {
                                //调用getBean()来创建Dependent bean
                                getBean(dep);
                            }
                            catch (NoSuchBeanDefinitionException ex) {
                                throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                                        "'" + beanName + "' depends on missing bean '" + dep + "'", ex);
                            }
                        }
                    }
                    // 开始创建bean,DefaultSingletonBeanRegistry提供的getSingleton模板方法,接受一个ObjectFactory的函数来创建bean。
                    if (mbd.isSingleton()) {
                        sharedInstance = getSingleton(beanName, () -> {
                            try {
                                //createBean由子类AbstractAutowireCapableBeanFactory实现
                                return createBean(beanName, mbd, args);
                            }
                            catch (BeansException ex) {
                                // Explicitly remove instance from singleton cache: It might have been put there
                                // eagerly by the creation process, to allow for circular reference resolution.
                                // Also remove any beans that received a temporary reference to the bean.
                                destroySingleton(beanName);
                                throw ex;
                            }
                        });
                        //如果是单例bean,则直接返回;如果是FactoryBean,则返回FactoryBean
                        bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
                    }
                    //创建prototype类型的bean
                    else if (mbd.isPrototype()) {
                        // It's a prototype -> create a new instance.
                        Object prototypeInstance = null;
                        try {
                            beforePrototypeCreation(beanName);
                            //原型bean每次getBean的时候都会去创建一个新的bean
                            prototypeInstance = createBean(beanName, mbd, args);
                        }
                        finally {
                            afterPrototypeCreation(beanName);
                        }
                        //如果是单例bean,则直接返回;如果是FactoryBean,则返回FactoryBean
                        bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
                    }
                    else {
                        //customer scope的处理
                        String scopeName = mbd.getScope();
                        final Scope scope = this.scopes.get(scopeName);
                        if (scope == null) {
                            throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
                        }
                        try {
                            Object scopedInstance = scope.get(beanName, () -> {
                                beforePrototypeCreation(beanName);
                                try {
                                    return createBean(beanName, mbd, args);
                                }
                                finally {
                                    afterPrototypeCreation(beanName);
                                }
                            });
                            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);
                        }
                    }
                }
                catch (BeansException ex) {
                    cleanupAfterBeanCreationFailure(beanName);
                    throw ex;
                }
            }
            if (requiredType != null && !requiredType.isInstance(bean)) {
                try {
                    T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
                    if (convertedBean == null) {
                        throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
                    }
                    return convertedBean;
                }
                catch (TypeMismatchException ex) {
                    if (logger.isTraceEnabled()) {
                        logger.trace("Failed to convert bean '" + name + "' to required type '" +
                                ClassUtils.getQualifiedName(requiredType) + "'", ex);
                    }
                    throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
                }
            }
            return (T) bean;
        }
    
        @Override
        public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
            Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
            // Remove from old position, if any
            this.beanPostProcessors.remove(beanPostProcessor);
            // Track whether it is instantiation/destruction aware
            if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) {
                this.hasInstantiationAwareBeanPostProcessors = true;
            }
            if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) {
                this.hasDestructionAwareBeanPostProcessors = true;
            }
            // Add to end of list
            this.beanPostProcessors.add(beanPostProcessor);
        }
        //销毁bean
        public void destroyBean(String beanName, Object beanInstance) {
            destroyBean(beanName, beanInstance, getMergedLocalBeanDefinition(beanName));
        }
        //销毁bean
        protected void destroyBean(String beanName, Object bean, RootBeanDefinition mbd) {
            new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), getAccessControlContext()).destroy();
        }
        //根据beanName获取bean的class对象
        @Nullable
        protected Class<?> resolveBeanClass(final RootBeanDefinition mbd, String beanName, final Class<?>... typesToMatch)
                throws CannotLoadBeanClassException {
            try {
                if (mbd.hasBeanClass()) {
                    return mbd.getBeanClass();
                }
                if (System.getSecurityManager() != null) {
                    return AccessController.doPrivileged((PrivilegedExceptionAction<Class<?>>) () ->
                        doResolveBeanClass(mbd, typesToMatch), getAccessControlContext());
                }
                else {
                    return doResolveBeanClass(mbd, typesToMatch);
                }
            }
            catch (PrivilegedActionException pae) {
                ClassNotFoundException ex = (ClassNotFoundException) pae.getException();
                throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), ex);
            }
            catch (ClassNotFoundException ex) {
                throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), ex);
            }
            catch (LinkageError err) {
                throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), err);
            }
        }
        //获取bean,如果是单例bean,则直接返回;如果是FactoryBean,则返回FactoryBean.getObject()
        protected Object getObjectForBeanInstance(
                Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) {
    
            // Don't let calling code try to dereference the factory if the bean isn't a factory.
            if (BeanFactoryUtils.isFactoryDereference(name)) {
                if (beanInstance instanceof NullBean) {
                    return beanInstance;
                }
                if (!(beanInstance instanceof FactoryBean)) {
                    throw new BeanIsNotAFactoryException(transformedBeanName(name), beanInstance.getClass());
                }
            }
    
            // Now we have the bean instance, which may be a normal bean or a FactoryBean.
            // If it's a FactoryBean, we use it to create a bean instance, unless the
            // caller actually wants a reference to the factory.
            if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
                return beanInstance;
            }
    
            Object object = null;
            if (mbd == null) {
                object = getCachedObjectForFactoryBean(beanName);
            }
            if (object == null) {
                // Return bean instance from factory.
                FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
                // Caches object obtained from FactoryBean if it is a singleton.
                if (mbd == null && containsBeanDefinition(beanName)) {
                    mbd = getMergedLocalBeanDefinition(beanName);
                }
                boolean synthetic = (mbd != null && mbd.isSynthetic());
                object = getObjectFromFactoryBean(factory, beanName, !synthetic);
            }
            return object;
        }
    
        ---------抽象方法---------
        //检查该BeanFactory里是否包含beanName对应的BeanDefinition
        protected abstract boolean containsBeanDefinition(String beanName);
        //根据beanName返回BeanDefinition
        protected abstract BeanDefinition getBeanDefinition(String beanName) throws BeansException;
        //根据给定的beanDefinition创建bean实例
        protected abstract Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
                throws BeanCreationException;
    }
    

    相关文章

      网友评论

        本文标题:Spring IOC(5)AbstractBeanFactory

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