美文网首页
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