Spring源码分析---创建bean

接上一篇(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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 觉知的力量 这两天陆续写的一千多类似意识流的文字,突然消失了。看到这样的结果,一股懊恼之心油然升起,不过,几秒钟停...
    张燕娟的成长家园阅读 778评论 0 0
  • 爱人好累,连被爱也是 所有人都看穿了我铁了心的喜欢他,可只有我自己心里明白认真起来的我现在有多么狼狈。感情可真奇妙...
    全国出溜滑亚军获得者阅读 211评论 0 1
  • 此次上海行,学习培训是主要任务,将会在培训报告中谈其收获与感想,这里不再赘述! 紧张之余,总是要找...
    暮霭夕颜阅读 415评论 0 1

友情链接更多精彩内容