美文网首页
4.1.3Spring源码解析——getBean方法细节之cre

4.1.3Spring源码解析——getBean方法细节之cre

作者: szhlcy | 来源:发表于2018-10-19 14:45 被阅读0次

    createBean方法在AbstractBeanFactory类中定义,具体实现在AbstractAutowireCapableBeanFactory类中实现,关于getBean方法的整体解析可以看这里getBean方法解析

    protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
            if (logger.isDebugEnabled()) {
                logger.debug("Creating instance of bean '" + beanName + "'");
            }
            // 确保此时实际解析了bean类
    //-----------------------------------------------方法1-----------------------------------------------//
            resolveBeanClass(mbd, beanName);
    //-----------------------------------------------方法1-----------------------------------------------//
            // Prepare method overrides.
            try {
                mbd.prepareMethodOverrides();
            }
            catch (BeanDefinitionValidationException ex) {
                throw new BeanDefinitionStoreException(mbd.getResourceDescription(),
                        beanName, "Validation of method overrides failed", ex);
            }
    
            try {
                // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
    //-----------------------------------------------方法2-----------------------------------------------//
            //如果bean实现了实例化前处理器接口的,则需要在实例化之前调用这个方法
          //bean的生命周期的中实现了InstantiationAwareBeanPostProcessor会在这里调用实现的postProcessBeforeInstantiation
                Object bean = resolveBeforeInstantiation(beanName, mbd);
    //-----------------------------------------------方法2-----------------------------------------------//
                if (bean != null) {
                    return bean;
                }
            }
            catch (Throwable ex) {
                throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                        "BeanPostProcessor before instantiation of bean failed", ex);
            }
    //-----------------------------------------------方法3-----------------------------------------------//
            Object beanInstance = doCreateBean(beanName, mbd, args);
    //-----------------------------------------------方法3-----------------------------------------------//
            if (logger.isDebugEnabled()) {
                logger.debug("Finished creating instance of bean '" + beanName + "'");
            }
            return beanInstance;
        }
    
    • 1.方法1resolveBeanClass在AbstractBeanFactory中定义

    protected Class<?> resolveBeanClass(final RootBeanDefinition mbd, String beanName, final Class<?>... typesToMatch)
                throws CannotLoadBeanClassException {
            try {
                //如果传入的RootBeanDefinition已经解析过,就直接返回RootBeanDefinition对象中的beanCalss
                if (mbd.hasBeanClass()) {
                    return mbd.getBeanClass();
                }
                //不管能不能获取系统安全性都去获取RootBeanDefinition对象中的class
                if (System.getSecurityManager() != null) {
                    return AccessController.doPrivileged(new PrivilegedExceptionAction<Class<?>>() {
                        public Class<?> run() throws Exception {
                            return 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);
            }
        }
    
    • 2.方法2resolveBeforeInstantiation在AbstractAutowireCapableBeanFactory中定义

    protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
            Object bean = null;
            //beforeInstantiationResolved默认为false
            if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
                // Make sure bean class is actually resolved at this point.
                //检查这个bean是不是存在beanClass,是不是不是合成的,是否实现了InstantiationAwareBeanPostProcessor(bean实例化之后但在设置显式属性或自动装配之前的处理)接口
                if (mbd.hasBeanClass() && !mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
                  //--------------------------方法1-------------------------//
                    bean = applyBeanPostProcessorsBeforeInstantiation(mbd.getBeanClass(), beanName);
                //--------------------------方法1-------------------------//
                    if (bean != null) {
    //--------------------------方法2-------------------------//
                      //挨个调用postProcessAfterInitialization方法
                        bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
    //--------------------------方法2-------------------------//
                    }
                }
                mbd.beforeInstantiationResolved = (bean != null);
            }
            return bean;
        }
    
    
    //--------------------------方法1-------------------------//
        protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName)
                throws BeansException {
            //获取这个bean的所有BeanPostProcessor
            for (BeanPostProcessor bp : getBeanPostProcessors()) {
                //如果是InstantiationAwareBeanPostProcessor类型的,就调用实现的方法
                if (bp instanceof InstantiationAwareBeanPostProcessor) {
                    InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                //调用实现的postProcessBeforeInstantiation方法
                    Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
                    if (result != null) {
                        return result;
                    }
                }
            }
            return null;
        }
    //--------------------------方法2-------------------------//
        public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
                throws BeansException {
    
            Object result = existingBean;
            for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
                result = beanProcessor.postProcessAfterInitialization(result, beanName);
                if (result == null) {
                    return result;
                }
            }
            return result;
        }
    

    方法3 doCreateBean方法这个方法比较复杂,所以另外开一篇描述

    doCreateBean方法分析

    相关文章

      网友评论

          本文标题:4.1.3Spring源码解析——getBean方法细节之cre

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