美文网首页
Spring源码分析---创建bean

Spring源码分析---创建bean

作者: shoulda | 来源:发表于2018-07-06 10:11 被阅读0次

    接上一篇(Spring源码分析---单例的加载获取)。

    create的分析

    上一篇中分析到ObjectFactory的核心部分其实只是调用 createBean方法,接下来我们来分析下createBean.

        protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
            if (this.logger.isDebugEnabled()) {
                this.logger.debug("Creating instance of bean '" + beanName + "'");
            }
    
            RootBeanDefinition mbdToUse = mbd;
            Class<?> resolvedClass = this.resolveBeanClass(mbd, beanName, new Class[0]);
            if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
                mbdToUse = new RootBeanDefinition(mbd);
                mbdToUse.setBeanClass(resolvedClass);
            }
    
            try {
                mbdToUse.prepareMethodOverrides();
            } catch (BeanDefinitionValidationException var7) {
                throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(), beanName, "Validation of method overrides failed", var7);
            }
    
            Object beanInstance;
            try {
                beanInstance = this.resolveBeforeInstantiation(beanName, mbdToUse);
                if (beanInstance != null) {
                    return beanInstance;
                }
            } catch (Throwable var8) {
                throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "BeanPostProcessor before instantiation of bean failed", var8);
            }
    
            beanInstance = this.doCreateBean(beanName, mbdToUse, args);
            if (this.logger.isDebugEnabled()) {
                this.logger.debug("Finished creating instance of bean '" + beanName + "'");
            }
    
            return beanInstance;
        }
    

    从代码中我们可以总结出函数完成的具体步骤及功能如下

    (1)根据设置的class属性或则根据className来解析Class.

    (2)对override属性进行标记及验证

          在spring配置中是存在lookuo-method和replace-method的,        
    

    而这个两个配置的加载其实就是将配置统一存放在BeanDefinition中的methodOverrides属性里,而这个函数的操作其实也就是针对于这两个配置的。

    (3)应用初始化前的后处理器,解析指定bean是否存在初始化前的短路操作。

    (4)创建bean

    实例化bean的前置分析--resolveBeforeInstantiation()

    protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {  
            Object bean = null;  
            if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {  
                // Make sure bean class is actually resolved at this point.  
                if (mbd.hasBeanClass() && !mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {  
                    //3.1、执行InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation回调方法  
                    bean = applyBeanPostProcessorsBeforeInstantiation(mbd.getBeanClass(), beanName);  
                    if (bean != null) {  
                        //3.2、执行InstantiationAwareBeanPostProcessor的postProcessAfterInitialization回调方法  
                        bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);  
                    }  
                }  
                mbd.beforeInstantiationResolved = (bean != null);  
            }  
            return bean;  
    }  
    

    通过上述代码可以进行实例化的预处理(自定义实例化bean,如创建相应的代理对象)和后处理(如进行自定义实例化的bean的依赖装配)
    参考:http://jinnianshilongnian.iteye.com/blog/1489787

    相关文章

      网友评论

          本文标题:Spring源码分析---创建bean

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