zoukankan      html  css  js  c++  java
  • bean的创建过程--doCreateBean

    createBean源码分析

    protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
        if (this.logger.isDebugEnabled()) {
            this.logger.debug("Creating instance of bean '" + beanName + "'");
        }
        //锁定class, 根据设置的class属性或者根据className来解析class
        this.resolveBeanClass(mbd, beanName, new Class[0]);
        //验证及准备覆盖的方法
        try {
            mbd.prepareMethodOverrides();
        } catch (BeanDefinitionValidationException var5) {
            throw new BeanDefinitionStoreException(mbd.getResourceDescription(), beanName, "Validation of method overrides failed", var5);
        }
    
        Object beanInstance;
        try {
            //BeanPostProcessors来返回代理替代真正的实例
            beanInstance = this.resolveBeforeInstantiation(beanName, mbd);
            if (beanInstance != null) {
                return beanInstance;
            }
        } catch (Throwable var6) {
            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "BeanPostProcessor before instantiation of bean failed", var6);
        }
    
        beanInstance = this.doCreateBean(beanName, mbd, args);
        if (this.logger.isDebugEnabled()) {
            this.logger.debug("Finished creating instance of bean '" + beanName + "'");
        }
    
        return beanInstance;
    }

    接着分析doCreateBean

    protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, Object[] args) {
            BeanWrapper instanceWrapper = null;
            if (mbd.isSingleton()) {
                instanceWrapper = (BeanWrapper)this.factoryBeanInstanceCache.remove(beanName);
            }
    
            if (instanceWrapper == null) {
                //根据指定bean使用对应的策略创建新的实例,
                instanceWrapper = this.createBeanInstance(beanName, mbd, args);
            }
    
            final Object bean = instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null;
            Class<?> beanType = instanceWrapper != null ? instanceWrapper.getWrappedClass() : null;
            synchronized(mbd.postProcessingLock) {
                if (!mbd.postProcessed) {
                    this.applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
                    mbd.postProcessed = true;
                }
            }
            //是否需要提早曝光:单例&允许循环依赖&当前bean正在创建中,检测循环依赖
            boolean earlySingletonExposure = mbd.isSingleton() && this.allowCircularReferences && this.isSingletonCurrentlyInCreation(beanName);
            if (earlySingletonExposure) {
                if (this.logger.isDebugEnabled()) {
                    this.logger.debug("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references");
                }
                //为避免循环依赖,在bean初始化前将创建实例的ObjectFactory加入工厂
                this.addSingletonFactory(beanName, new ObjectFactory<Object>() {
                    public Object getObject() throws BeansException {
                        return AbstractAutowireCapableBeanFactory.this.getEarlyBeanReference(beanName, mbd, bean);
                    }
                });
            }
    
            Object exposedObject = bean;
    
            try {
                //对bean进行填充,将各个属性值注入,其中,可能存在依赖于其他bean的属性,则会递归初始依赖bean
                this.populateBean(beanName, mbd, instanceWrapper);
                if (exposedObject != null) {
                    //调用初始化方法,比如init-method
                    exposedObject = this.initializeBean(beanName, exposedObject, mbd);
                }
            } catch (Throwable var17) {
                if (var17 instanceof BeanCreationException && beanName.equals(((BeanCreationException)var17).getBeanName())) {
                    throw (BeanCreationException)var17;
                }
    
                throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", var17);
            }
    
            if (earlySingletonExposure) {
                Object earlySingletonReference = this.getSingleton(beanName, false);
                //earlySingletonReference只有在检测到循环依赖的情况下才不为空
                if (earlySingletonReference != null) {
                    if (exposedObject == bean) {
                        exposedObject = earlySingletonReference;
                    } else if (!this.allowRawInjectionDespiteWrapping && this.hasDependentBean(beanName)) {
                        String[] dependentBeans = this.getDependentBeans(beanName);
                        Set<String> actualDependentBeans = new LinkedHashSet(dependentBeans.length);
                        String[] var12 = dependentBeans;
                        int var13 = dependentBeans.length;
                        //检测依赖
                        for(int var14 = 0; var14 < var13; ++var14) {
                            String dependentBean = var12[var14];
                            if (!this.removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
                                actualDependentBeans.add(dependentBean);
                            }
                        }
                        //因为bean创建后其所依赖的bean一定是已创建的,actualDependentBeans不为空则表示当前bean创建后其依赖的bean却没有被全部创建完,也就是说存在循环依赖
                        if (!actualDependentBeans.isEmpty()) {
                            throw new BeanCurrentlyInCreationException(beanName, "Bean with name '" + beanName + "' has been injected into other beans [" + StringUtils.collectionToCommaDelimitedString(actualDependentBeans) + "] in its raw version as part of a circular reference, but has eventually been " + "wrapped. This means that said other beans do not use the final version of the " + "bean. This is often the result of over-eager type matching - consider using " + "'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
                        }
                    }
                }
            }
    
            try {
                //检测scope注册bean
                this.registerDisposableBeanIfNecessary(beanName, bean, mbd);
                return exposedObject;
            } catch (BeanDefinitionValidationException var16) {
                throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", var16);
            }
    }

    简述doCreateBean:

    1:如果是单例则需要首先清楚缓存

    2:实例化bean,将BeanDefinition转换为BeanWrapper

    3:MergedBeanDefinitionPostProcessor的应用

    4:依赖处理

    5:属性填充

    6:循环依赖检查

    7:注册DisposableBean

    8:完成创建并返回

  • 相关阅读:
    redo log 转csdn之ppp_10001
    Kafka的topic的partitions数的选取
    log4j:WARN No appenders could be found for logger
    HBase统计表的行数
    /bin/bash: /us/rbin/jdk1.8.0/bin/java: No such file or directory
    HBase shell命令
    Linux按名字杀死进程
    Kafka常用命令
    Plugin 'mavenassemblyplugin:' not found
    Linux搜索指定目录中所有文件的内容
  • 原文地址:https://www.cnblogs.com/chenpt/p/13719350.html
Copyright © 2011-2022 走看看